在编译时进行通用类型检查

时间:2012-04-27 13:08:15

标签: java generics

让我们看一些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 个答案:

答案 0 :(得分:5)

答案 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

的更多信息,请参阅