Почему выполняется компиляция следующего кода?
Метод IElement.getX(String)
возвращает экземпляр типа IElement
или его подклассов. Код в классе Main
вызывает метод getX(String)
. Компилятор позволяет сохранить возвращаемое значение переменной типа Integer
(которая явно не находится в иерархии IElement
).
public interface IElement extends CharSequence {
<T extends IElement> T getX(String value);
}
public class Main {
public void example(IElement element) {
Integer x = element.getX("x");
}
}
Не должен ли возвращаемый тип быть экземпляром IElement
- даже после стирания типа?
Байт-код метода getX(String)
:
public abstract <T extends IElement> T getX(java.lang.String);
flags: ACC_PUBLIC, ACC_ABSTRACT
Signature: #7 // <T::LIElement;>(Ljava/lang/String;)TT;
Изменить: Заменяется String
последовательно с Integer
.