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 に答える