35

为什么下面的代码会编译?该方法返回该类型或其子类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.

4

1 回答 1

26
于 2015-04-16T09:27:41.393 回答