静的ジェネリックメソッドの呼び出し


106

静的なジェネリックメソッドに関する奇妙な状況に遭遇しました。これはコードです:

class Foo<E>
{
    public static <E> Foo<E> createFoo()
    {
        // ...
    }
}

class Bar<E>
{
    private Foo<E> member;

    public Bar()
    {
        member = Foo.createFoo();
    }
}

式で型引数を指定する必要がないのはFoo.createFoo()なぜですか?これはある種の型推論ですか?それについて明示的にしたい場合、型引数をどのように指定できますか?


7
createFooメソッドのタイプパラメータEを変更することをお勧めします。ので、クラスFooの型パラメーターEは、メソッドcreateFoo()の型パラメーターEとは異なります。
Gursel Koca

@GurselKoca彼は明示的にmember = Foo。<E> createFoo();を実行できました。コンパイル時と同じにする必要があります。
George Xavier

回答:


183

はい、これは、JLSセクション15.12.2.8に従って、割り当てのターゲットに基づく型推論です。明確にするために、次のように呼び出します。

Foo.<String>createFoo();

3
または、私の場合のように:Foo.<E>createFoo();ありがとう:)
fredoverflow

7
割り当てなしでもこれが機能するのはなぜですか?つまり、ステートメント問題なくFoo.createFoo();コンパイルされます...?これは型の消去によるものですか?
fredoverflow 2011年

9
割り当てのない@FredOverflow Eは「推測」されるObject
評判が悪い2011年

2
新しいリンクの場所は、おそらく次のようになります。docs.oracle.com/javase/specs/jls/se8/html/...
Joanis

3
タイプを指定する別の方法Eを定義することであろうcreateFoo()タイプの引数を取るClass<E>(それがあろうようにcreateFoo(Class<E> type))、およびとそれを呼び出すcreateFoo(String.class)
ギャビンS.ヤンシー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.