Интересно, почему эта часть кода успешно компилируется?
Исходный код:
abstract class A<K extends Number>
{
public abstract <M> A<? super M> useMe(A<? super M> k);
}
Скомпилировано успешно
Как это работает и почему это компилируется? M - это любой тип, так почему его можно использовать?. Должно ли быть: <M extends Number>
?
Это не скомпилируется:
abstract class A<K extends Number>
{
public abstract <M> A<? super M> useMe(A<M> k);
}
Сообщение об ошибке:
аргумент типа M не находится в пределах границ переменной типа K, где M, K являются переменными типа: M extends Объект, объявленный в методе useMe (A) K extends Число, объявленное в классе A
В чем разница?