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