2012-01-14 20 views
1

静的な作成メソッドを含むクラスがあります。ジェネリッククラスから静的メソッドを呼び出す方法は?

public class TestClass { 

public static <E> TestClass<E> create() { 
    return new TestClass<E>(); 
    } 

} 

TestClass.create()を使用すると、コンパイルできます。しかし、TestClass<String>.create()を使用すると、コンパイルに失敗しました。どのようにジェネリックを指定するのですか?

+0

この[リンク]が[1]あなたを助けるかもしれない... [1]:のhttp://のstackoverflow。 com/questions/936377/static-method-in-a-generic-class –

+0

あなたの例は汎用クラスではありません。 –

+0

クラスの宣言は 'public class TestClass 'または 'public class Something'でなければなりませんか?宣言が具体的であるときに、クラス本体がTestClassをジェネリックとして使用することに苛立ちます。 – ThomasH

答えて

9

タイプ推論が失敗した場合にタイプを明示的に指定することを尋ねると仮定すると、TestClass.<String>create()を使用することができます(以前とは対照的に、タイプが.の後にあることに注意してください)。

+0

ありがとうございます。なぜこのような構文は、非常に反直感的なのでしょうか? –

+0

一般的なクラスの作成と非ジェネリッククラスのジェネリックメソッドへの追加の型パラメータの提供とを区別するのは、ジェネリックスを設計した人がそれに答えることができると誰も期待していないと思います。 –

+5

シンタックスは私には直感的ではありません。ジェネリックパラメータはメソッドシグネチャの一部であり、クラスシグネチャではありません。そのためにドットの後に来るべきです。ほとんどの場合、Generic型は推論でき、この明示的な型情報は 'List strings = Collections.emptyList();' –

4

ええ、それはかなり...直感的ではありません。

彼の効果的なジャワのジョシュブロッホのプレゼンテーション、問題についての第2版からの追記:「神は子猫あなたが明示的な型パラメータを指定するたびに殺します」。私はこのような構造を避けたいが、時にはそれを避けることはできない。

.文字の後にジェネリックパラメータを指定するのは、TestClass.<String>create()です。

+1

はTestClassと同じです some = TestClass.create()? –

1

ジェネリック型はクラス宣言で指定することができます。

public class TestClass<E> { 

    public static <E> TestClass<E> create() { 
     return new TestClass<E>(); 
    } 
} 

// Elsewhere in the code 
TestClass<String> testClass = TestClass.create(); 
+0

あなたはcreateメソッドで型を指定する必要はないのですか? –

+0

いいえ、この例のようにコンパイラが推論できることを意味します。 –

関連する問題