List<Integer> li = new ArrayList<Integer>();
List<Number> ln = li; // illegal
ln.add(new Float(3.1415));
В Java Integer наследует от Number (java.lang.Number)
, поэтому интуитивно все, что является целым числом (java.lang.Integer)
, также является числом, но в этой статье указывается, что с генериками это не работает, потому что, учитывая, что Например, вы можете в конечном итоге поместить число с плавающей точкой в число List<Integer>
, что недопустимо, поскольку число с плавающей точкой не является целым числом.
Вывод: Обобщения не ковариантны.
Примечание: Я рекомендую вам прочитать Effective Java (2nd Edition) Глава 5: Общие положения.