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);

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

4

4 に答える 4

5

contains一般化されていません。その署名は残ります:

boolean contains(Object o)

http://docs.oracle.com/javase/6/docs/api/java/util/Collection.html#contains(java.lang.Object)

ここにいくつかあります: http://smallwig.blogspot.com/2007/12/why-does-setcontains-take-object-not-e.html

于 2012-04-27T13:14:15.453 に答える
3

この質問への回答を参照してください。

基本的にcontains()remove()、 などのメソッドは、比較されて削除されるオブジェクトが等しいことのみを考慮し、それらが同じタイプであることは考慮しません。

于 2012-04-27T13:14:08.960 に答える
1

リストインターフェースAPIから:

E get(int index)

したがって、ジェネリック型のオブジェクトを返します。パラメータとしてcontains取得している間:Object

boolean contains(Object o) 

つまり、メソッドのシグネチャがすべてです。リストでもっと見る

于 2012-04-27T13:22:10.727 に答える
1

さて、この行:

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

明確に整数インスタンスであるものをブール値にキャストできないという理由だけで、コンパイル時エラーが発生します。List のジェネリックとは関係ありません。

次に、contains(Object o)(java.util.Collection 内で) 一般的に型指定されていないため、コンパイル時に警告が表示されません。これは、共分散と反分散に関係しています。

于 2012-04-27T13:16:00.887 に答える