2011-07-18 8 views
1

Javaでは、変数を宣言することとの違いはSetSet<Object>ですか? 2人は同等ではないでしょうか? Set<Object>変数をSetに代入すると、コンパイル時エラーが発生するのはなぜですか?Javaジェネリック:セットとセット<Object>

+0

質問を修正する必要があります – marc

答えて

1

いいえ:Set<>は一般的であり、Setはありません。論理的には、Set<Object>は(暗黙のうちに、Set of ObjectSetと同等のかもしれませんが、バイトコードはかなり異なっている:)

提案:

実行javapあなたのサンプルプログラムのコマンドと自分のためにこれを確認。

3

。それは単なる警告です。これは罰金コンパイルすなわち:

Set s = new HashSet(); 
Set<Object> so = new HashSet<Object>(); 
s = so; 

そしてついでにを、そう

so = s; 

をして、彼らは基本的に、使用の観点から、同じです。

0

2つは同等ではありません。 Set<Object>を割り当てると、実行時に失敗するであろうセットの安全でない操作を検出するコンパイラの能力が向上します。

これは、ジョシュ・ブロッホの優れたEffective Java, Second Edition、この例では、臆面もなく触発されたからで覆われている:インクルードが等しくないのはここ

public static void main(String[] args) { 
    List<String> typesafeStrings = new ArrayList<String>(); 
    unsafeAdd(typesafeStrings, new Integer(0)); // can add a Integer to a List<String>! 
    String s = typesafeStrings.get(0); // fails at runtime, not safe 

    typesafeStrings = new ArrayList<String>(); 
    safeAdd(typesafeStrings, new Integer(0)); // compiler error, safe! 
    s = typesafeStrings.get(0); 

} 

static void unsafeAdd(List list, Object o) { 
    list.add(o); 
} 

static void safeAdd(List<Object> list, Object o) { 
    list.add(o); 
} 
2

がある...

Set<String> s_str = new HashSet<String>(); 
Set s_plain = s_str; // This is valid, although you will get a compiler warning 

// This is invalid, the Set<String> cannot be implicitly cast to object even though 
// it's *contents* are all objects. 
Set<Object> s_obj = s_str; 

は、今度は、あなたが望んでいたとしましょう関数への引数として、例えば汎用Setを取らなければなりません。あなたは使用することができます。この場合、

function void foo(Set<? extends Object> s) {} 

を拡張し、SetSet<Object>Set<String>はすべて、それらはすべて異なっていても、関数に渡すことができます。

関連する問題