4

パラメーターを取らないジェネリック メソッドを含むコードと混同していたので、そのようなメソッドのジェネリック型の戻り値は次のようになります。

static <T> example<T> getObj() {
    return new example<T>() {

        public T getObject() {
            return null;
        }

    };
}

これは次の方法で呼び出されました:

example<String> exm = getObj(); // it accepts anything String like in this case or Object and everything

インターフェイスの定義example'sは次のとおりです。

public interface example<T> {

    T getObject();
}

私の質問:example<String> exm文字列、オブジェクト、およびすべてを受け入れることです。では、ジェネリックな戻り値の型が String として指定されているのはいつで、どのように??

4

2 に答える 2

10

コンパイラは、代入のLHSTで使用される具象型から の型を推測します。

このリンクから:

型パラメーターがメソッド引数の型に表示されない場合、コンパイラは実際のメソッド引数の型を調べて型引数を推測できません。型パラメーターがメソッドの戻り値の型にある場合、コンパイラは戻り値が使用されているコンテキストを調べます。メソッド呼び出しが割り当ての右側のオペランドとして表示される場合、コンパイラは、割り当ての左側のオペランドの静的型からメソッドの型引数を推測しようとします。

リンクのサンプルコードは、質問のものと似ています:

public final class Utilities { 
  ... 
  public static <T> HashSet<T> create(int size) {  
    return new HashSet<T>(size);  
  } 
} 
public final class Test 
  public static void main(String[] args) { 
    HashSet<Integer> hi = Utilities.create(10); // T is inferred from LHS to be `Integer`
  } 
}
于 2013-07-18T12:07:15.977 に答える