次のコードがコンパイルされるのはなぜですか? このメソッドは、型またはそのサブクラス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。