Я обнаружил странную ситуацию при создании родословных. Я запустил этот код:
class A { }
class B { }
public class Program {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<A> listA = new ArrayList<A>();
List<?> list = listA;
((List<B>)list).add(new B());
for (Object item : listA) {
System.out.println(item.toString());
}
}
}
Он очень хорошо компилируется (только с предупреждением, но без ошибок) и запускается без каких-либо исключений, а выход:
B @88140ed
Как я это сделал? Я имею в виду, почему Java разрешает мне это делать?
Я добавил экземпляр класса B в список A s?
Это очень плохое поведение дженериков. Почему это происходит?
Кстати, я попробовал это с Java 7.
EDIT:
Меня удивило то, что Java только уведомляет проблему с предупреждением о том, что каждый программист может ее игнорировать. Я знаю, что SuppressWarnings - плохая идея, но почему Java не отрицала такого поведения с ошибкой или исключением?
Кроме того, это предупреждение всегда показывалось, если вы считаете, что ваше кастинг правильный, у вас нет выбора, кроме как игнорировать его. Но если вы думаете, что это хорошее кастинг и игнорировать его, но это не так?