为什么下面的代码可以编译?
方法 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
。