2017-11-24 3 views
1

私は、Javaを学ぶために始めている、と私のプログラムでは、すべて私が期待する出力をコンパイルし、生成ジェネリックを `new`でインスタンス化するとき、型パラメータを含めるかどうかの間に実用的な違いがありますか?

Stack<Integer> s = new Stack<Integer>(); 

Stack<Integer> s = new Stack<>(); 

Stack<Integer> s = new Stack(); 

を表示されます。

実際的な違いはありますか?どちらが好ましい?

答えて

5
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文字追加するだけです。

+0

これは、最後のバージョンが生のタイプであることを知るためには不可欠でした。私は尋ねなかったので、そのようにしたいと思っていました。ありがとうございました。 –

+0

@DavidIはリストを試しました b = new ArrayList(); b.add(123); jdk 1.8でcompilreがエラー整数をStringにキャストすることはできませんでした。したがって、ジェネリックスの機能を失うことはなく、未加工の種類はサポートされていません。 – Ravik

+0

@Ravikそうですが、コンパイラからの警告を避けるには、 '@SuppressWarnings(" unchecked ")'の注釈を追加する必要があります。 –

0

3つの実装に違いはありません。コンパイル時エラーの場合、コンパイラは変数を宣言するときに左に示された詳細を調べます。 IJのオートコンプリートでStack<Integer> s = new Stack();コンパイラでStack<Integer> s = new Stack<>();

を生産するのに対し、私はそれがStack<Integer> s = new Stack<Integer>();を生成日食エディタで自動補完エディタEclipseとのIntelliJの違いを見ている は未チェックの割り当てを警告提供します。

+0

これは正しくありません。最初の2つの間に違いはありませんが、3つ目は生の型を使用し、型の安全性を失います。 –

+0

@Davidこのリストを試したところ b = new ArrayList(); b.add(123);コンパイラは私にエラーを与えました整数は文字列にCASEすることはできませんと言った。 – Ravik

+0

それは本当です、そして、私はちょうど私の推論が少しであることに気付きました。この場合、 'List 'という宣言はスコープ内にあるので、コンパイラは文字列を含まなければならないことを知っていますが、生の 'ArrayList 'を' List 'に割り当てるときには未チェックの変換について警告します。 –

0

実際的な違いはありません。すべて同じです。 基本的には、私たちが書く方法です。

以前のバージョンのJava Stack<Integer> s = new Stack<Integer>();は必須ですが、今はそうではありません。

私によれば
Stack<Integer> s = new Stack<>();ここでは警告が表示されないため、最良の方法です。

関連する問題