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(), etc 方法只关心被比较和删除的对象是否相等,而不是它们具有相同的类型。

于 2012-04-27T13:14:08.960 回答
1

好吧,这一行:

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

有编译时错误仅仅是因为您不能将明显是 Integer 实例的内容转换为布尔值。它与 List 的泛型无关。

然后,contains(Object o)不是一般类型的(在 java.util.Collection 中),这就是为什么您没有收到编译时警告的原因。这与协方差和逆变有关。

于 2012-04-27T13:16:00.887 回答
1

来自 List 接口 API:

E get(int index)

所以它返回泛型类型的对象。虽然作为参数contains获取:Object

boolean contains(Object o) 

所以这都是关于方法签名的。在列表中查看更多信息

于 2012-04-27T13:22:10.727 回答