Почему этот универсальный метод с привязкой может возвращать любой тип?
Почему следующий код компилируется? Метод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
.