7

私は少し一般的なコードを見つけました、そしてそれはそれが実際にどのように機能するかについて私を困惑させました。Tに使用されるジェネリック型がどこで取得されるのかわかりません。これは単純化された例ですが、これがどのように有効なJavaコードであるかはまだわかりません。

public static void main(String[] args) {
  System.out.print(get());
}

public static <T> T get()
{
  return (T) getObj();
}

public static Object getObj() 
{
  return Boolean.FALSE;
}
4

2 に答える 2

4

型推論は、コールサイトに基づいて行われます。

ただし、型推論は、戻り値が変数に割り当てられている場合にのみ、戻り型に適用されます。これはスペックに書かれています

メソッドの結果が割り当て変換の対象となるコンテキストで発生する場合、[...]

それ以外の場合、未解決の型パラメーターは常にになりObjectます。
あなたの例では、過負荷があるので、それはうまくいくでしょうprint(Object)

一方、次のコードを見てください。

print(get());

public void print(Boolean x) { }

public <T> T get() {
    return (T) Boolean.FALSE;
}

コンパイラはを見る前にget()戻ると推測するため、これによりコンパイルエラーが発生します。Objectprint()

于 2013-01-10T17:07:01.677 に答える
2

あなたが書いたコードでは、Tは何にもバインドされていません。Javaは、メソッドを呼び出すたびにTに型を割り当て、get返されると予想される型を調べます...しかし、これは、待機している型を明示的に宣言した場合にのみ機能するようです。次の例を見てください。

public static void jump(String a) {
}

public static <T> T get() {
    return (T) null;
}

public static void main(String[] args) {
    //This works quite well, generic parameter T is inferred to be String
    String blah = get();
    jump(blah);
}

一方で

public static void jump(String a) {
}

public static <T> T get() {
    return (T) null;
}

public static void main(String[] args) {
    //This doesn't work, Java does not bind T to anything hence Object is used... and no jump for object is found
    jump(get());
}

少なくとも、これがJava6での動作方法です。

于 2013-01-10T16:58:26.327 に答える