Почему этот универсальный метод с привязкой может возвращать любой тип?

Почему следующий код компилируется? Метод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.

Ответы на вопрос(1)

Ваш ответ на вопрос