Почему выполняется компиляция следующего кода?
Метод 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.