Рассмотрим фрагмент:
Number[] numbers = {1, 2.3, 4.5f, 6000000000000000000L};
Совершенно нормально делать это, Number
- абстрактный класс.
Вперед,
List<Long> listLong = new ArrayList<Long>();
listLong.add(Long.valueOf(10));
List<Number> listNumbers = listLong; // compiler error - LINE 3
listNumbers.add(Double.valueOf(1.23));
Была построена линия 3, которая была успешно скомпилирована,
мы получим List
of Number
s, т.е.
for(Number num: listNumbers ){
System.out.println(num);
}
// 10
// 1.23
которые являются всеми числами.
Я наткнулся на это в книге,
Generics не поддерживает подтипирование, потому что это вызовет проблемы в достижение безопасности типа. Вот почему
List<T>
не считается подтипList<S>
, гдеS
- супертипT
Какой тип безопасности был бы потерян в этом конкретном случае, как обсуждалось выше, должны ли были успешно компилироваться строки 3?