Stack<Integer> s = new Stack<Integer>();
このフォームは、ジェネリックスが初めて導入されたときにJava 5およびJava 6で必要でした。しかし、Java 7以降、必要以上に冗長です。
Stack<Integer> s = new Stack<>();
この形式は、Java 7で導入され、プログラマがそれを繰り返す必要がないように、コンパイラが型を推論する以外、上記と同じですました。 これが好ましい形式です。
Stack<Integer> s = new Stack();
これは生タイプを使用して、悪いです。 Java 5より前のバージョンとの下位互換性は許されていますが、コンパイラはraw Stack
を一般的にタイプされたStack<Integer>
に割り当てることが「チェックされていない変換」であると不平を言うでしょう。
作成Stack
が生Stack<Object>
ですが、オリジナルへの参照、生Stack
が開催されていない、とStack
はあなたが合格することはできませんので、それは型の安全性が失われていることを、この例では、すぐに明確ではありません私たちが作成して割り当てを壊すならば、問題が明確になってもStack
で
List<Integer> numbers = List.of(12, 34, 56);
List<String> names = new ArrayList(numbers); // "unchecked conversion" warning
for (String name : names) { // ClassCastException
System.out.println(name);
}
:それを移入するために、それは、そのようなArrayList
などの別のタイプで起こる可能性パラメータ
Stack rawStack = new Stack(); // create Stack of raw types
Stack<String> typedStack = rawStack; // "unchecked conversion" to
// strongly-typed Stack
rawStack.push(123); // push an Integer
typedStack.pop(); // ClassCastException
この場合、元の生スタックへの参照が保持されており、タイプの安全性に違反する可能性があります。 「まあ、私はこれをしません」と言うかもしれませんが、それを強くタイプする代わりに、最初にnew Stack<>()
という文字列を2文字追加するだけです。
これは、最後のバージョンが生のタイプであることを知るためには不可欠でした。私は尋ねなかったので、そのようにしたいと思っていました。ありがとうございました。 –
@DavidIはリストを試しました b = new ArrayList(); b.add(123); jdk 1.8でcompilreがエラー整数をStringにキャストすることはできませんでした。したがって、ジェネリックスの機能を失うことはなく、未加工の種類はサポートされていません。 –
Ravik
@Ravikそうですが、コンパイラからの警告を避けるには、 '@SuppressWarnings(" unchecked ")'の注釈を追加する必要があります。 –