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>?