2012-04-27 3 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 для Boolean. Это не имеет ничего общего с дженериками Листа.

Тогда contains(Object o) не типично типизирован (внутри java.util.Collection), поэтому вы не получаете предупреждение о времени компиляции. Это связано с ковариацией и противоречием.

1

из списка интерфейсов API:

E get(int index) 

Так он возвращает объект родового типа. В то время как contains получает Object как пары:

boolean contains(Object o) 

так что все о методах подписях. См. Больше на List

Смежные вопросы