Интересно, почему этот фрагмент кода успешно компилируется?Ограниченный подстановочный знак не проверен параметром верхнего ограниченного типа
Исходный код:
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);
}
Сообщение об ошибке:
аргумент типа М не в границах переменной K типа, где M, K являются переменными типа: М расширяет объект объявлен в методе useMe (A) K продолжение Номер, указанный в классе A
В чем разница?
Вы можете получить более качественные ответы, включив фактическое сообщение об ошибке, которое вы получаете от компилятора. (Нам не нужно начинать IDE, чтобы понять ваш вопрос.) – meriton
Какое фактическое сообщение об ошибке? Вопрос в том, почему это компилируется? –
Примечание для тех, кто интересуется, заменяя '' '' 'M extends Number>' в более поздней версии, он также позволяет скомпилировать его. –
Guvante