让我们看一些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);
那么为什么我不能在通用案例中得到错误?
答案 0 :(得分: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
答案 1 :(得分:3)
请参阅this question的答案。
基本上contains()
,remove()
等方法只关心被比较和被删除的对象是相等,而不是它们具有相同的类型。
答案 2 :(得分:1)
好吧,这一行:
s.contains((Boolean)(new Integer(3)));
编译时错误只是因为你无法将Integer实例显然转换为Boolean。它与List的泛型无关。
然后,contains(Object o)
不是一般类型(在java.util.Collection中),这就是你没有得到编译时警告的原因。这与协方差和反方差有关。
答案 3 :(得分:1)
来自List interface API:
E get(int index)
因此它返回泛型类型的对象。虽然contains
获得Object
作为参数:
boolean contains(Object o)
所以关于方法签名。 有关List
的更多信息,请参阅