abstract class Type<K extends Number> {
abstract <K> void use1(Type<K> k); // Compiler error (Type parameter K is not within its bounds)
abstract <K> void use2(Type<? extends K> k); // fine
abstract <K> void use3(Type<? super K> k); // fine
}
Метод generic type K затеняет класс generic типа K, поэтому <K>
не соответствует <K extends Number>
в use1()
. Компилятор ничего не знает о новом родовом типе <K>
в use2()
и use3()
, но все же законно компилировать. Почему <? extends K>
(или <? super K>
) соответствует <K extends Number>
?