¿Por qué este método genérico con un límite puede devolver algún tipo?

¿Por qué se compila el siguiente código? El métodoIElement.getX(String) devuelve una instancia del tipoIElement o de sus subclases. El código en elMain la clase invoca elgetX(String) método. El compilador permite almacenar el valor de retorno en una variable del tipoInteger (que obviamente no está en la jerarquía deIElement)

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");
  }
}

¿No debería ser el tipo de retorno una instancia deIElement - incluso después del borrado de tipo?

El bytecode de lagetX(String) El método es:

public abstract <T extends IElement> T getX(java.lang.String);
flags: ACC_PUBLIC, ACC_ABSTRACT
Signature: #7                           // <T::LIElement;>(Ljava/lang/String;)TT;

Editar: ReemplazadoString consistentemente conInteger.

Respuestas a la pregunta(1)

Su respuesta a la pregunta