Подстановочный знак с окончательной верхней границей

Class<? extends Integer> будет компилироваться нормально, но Integer является окончательным типом, поэтому нет смысла использовать его в качестве верхней границы (ничто никогда не extend его).

Если вы попытаетесь использовать окончательный тип в качестве верхней границы для параметра типа, вы получите предупреждение компилятора:

Параметр типа T не должен быть ограничен конечным типом Integer. Окончательные типы не могут быть расширены

Почему использование окончательного типа в качестве верхней границы для подстановочного знака было бы совершенно нормально, но выдавало бы предупреждение для параметра типа? Почему Java даже позволяет ограничивать подстановочные знаки конечным верхним типом?


person Jeffrey    schedule 11.08.2012    source источник


Ответы (1)


Class<Integer> не так допускает назначение, как Class<? extends Integer>.

Например, это компилируется:

Class<? extends Number> numberClass = Integer.class;
Class<? extends Integer> integerClass = numberClass.asSubclass(Integer.class);

Это не:

Class<? extends Number> numberClass = Integer.class;
Class<Integer> integerClass = numberClass.asSubclass(Integer.class);

Лично я не мог получить предупреждение компилятора, как вы (возможно, вы могли бы привести пример и подробности о вашем компиляторе?).

person Mark Peters    schedule 11.08.2012
comment
Мне кажется, что компилятор мог сам выяснить, что Class<? extends Integer>, возвращенное из вашего второго примера, совместимо с Class<Integer>, потому что Integer является окончательным. Но я полагаю, что это добавило бы компилятору больше сложности, чем его ценности. Возможно, предупреждение относится к Eclipse: Eclipse Juno с JDT 3.8.0. - person Jeffrey; 12.08.2012