2012-04-27 12 views
0

Set<E>のメソッド宣言を見てみましょう。コンパイル時の汎用型チェック

public boolean add(E e); 
public E get(int index); 

これを試してみましょう。

List<Boolean> list = new ArrayList<Boolean>(); 
Integer i = list.get(0);    //Predictably, here we get a compile error. 
list.contains(new Integer(3));  //But this line is allowed. Why? 

私が知っているように(このコードは単純にそのコードに変換されます)、このコードの非ジェネリックであっても、両方の行にコンパイルエラーが発生します。

List s = new ArrayList(); 
s.contains((Boolean)(new Integer(3))); 
Integer i = (Boolean)s.get(3); 

なぜ、一般的なケースでエラーが発生しますか?

答えて

3

this questionへの回答を参照してください。

基本的、remove()、などの方法が唯一のオブジェクトが比較して除去されることを気にし、それらが同じ型を持っていないこと、等しいあります。

1

さて、この行:あなたは何をキャストすることはできませんので

s.contains((Boolean)(new Integer(3))); 

は、単に時間のエラーをコンパイルしていますブール値へのIntegerインスタンスListのジェネリックスとは何の関係もありません。

次に、contains(Object o)は(java.util.Collection内に)一般的に型付けされていないため、コンパイル時の警告が表示されません。これは共分散と逆分散と関係があります。 ListインタフェースのAPIから

1

E get(int index) 

だから、ジェネリック型のオブジェクトを返します。 containsがPARAMとしてObjectを取得している間:

boolean contains(Object o) 

ので、それはすべてのメソッドシグネチャについてです。 続きを見るList

関連する問題