2017-10-26 6 views
1

次のコードは私にとって非常に混乱しています。クラスの静的メンバーのジェネリックとの混乱

public class Test<T> { 
    public static <T> Test<T> ok(T result) { 
    .. 

私はクラス名でジェネリックスを理解しています。 「OK」メソッドは、この

public static Test<T> ok(T result) { 

またはこの

public static T ok(T result) { 

しかし、なぜ、余分な< T>は、私は理解していないテスト< T>戻り値の型の前に存在しているようなものだ場合、私は理解できます。

+0

返り値または戻り値が "2"の場合は、を返します。その前に余分にが含まれています。なぜなら、Tが返されたのは、<>がなく、テストがなければTではないからです。 luky

+0

コンパイラーは一般的な型を持っているので、そこにあります。他のTsはそれを通常の形で満たすためのものです。 – LenglBoy

+0

重要なものであることの前に '' クラス宣言内の1つ( 'クラスTest ')より_異なる_ Tがok'。どちらも同じ名前を持っていますが、2つの全く異なる型パラメータがあります。クラス宣言からのものはインスタンスメソッドでのみ利用可能で、 'ok'のものはそこでのみ利用可能です。 ( 'T result'は' Test 'ではなく' ok'に対して宣言されたものを使用します)。 – yshavit

答えて

5

例は、他の<T>が唯一の方法に適用される異なるジェネリック型を指す

public class Test<T> { 
    public static <U> Test<U> ok(U result) { 
    .. 

に相当事実にあります。混乱を避けるためには、異なるものを異なる名前で使用する方がよいでしょう。

+0

もしそれが返されるならば、なぜメソッドisnt public static ok(U result);または静的な静的U ok(U結果)。 (私はブラケットが、おそらくそれはOKメソッドのパラメータとしてUに関連して強調しているため、最初のオプションは、より理にかなって思いますが、それはUを返した場合、その後もテストありますとにかく、なぜ? – luky

+1

'は'新しいジェネリック型を最初に導入しコンパイラの観点からすれば、2つあり、メソッドの中で ''または ''のどちらかを使うことができます。ただ1つしか持たない場合は、余分な ''を省略し、 '' 'クラスレベルから – jurez

+0

Aha i今すぐご覧ください。最初のはあなたが言うように新しい汎用変数を導入し、2番目が戻り値の型です。ありがとうございます。 – luky

2

静的メソッドあるので、インスタンスのジェネリック型パラメータによって影響されません。

あなたはok方法は、一般的なパラメータに拘束されることにしたい場合は、あなたがそのように、唯一のT種類のテストを作る工場としてTestFactory<T>クラスのようなものを作成する必要があります。

public class TestFactory<T> { 
    public Test<T> ok(T result) { 
     // ... 
    } 
} 

でそうこの場合はTestFactory<String>Stringの結果しか許されませんが、それ以外はコンパイラエラーです。

あなたは、静的メソッドを好む場合は、混乱を避けるために掲示@jurez何をすべき事柄は、この静的メソッドのその型パラメータのみ与えられた入力パラメータの種類によって異なり、です。

+0

情報ありがとうございました。 Diky – luky

+1

問題はありませんが、少しでも更新しました。もともと私は@jurezが書いたことを指摘したいと思っていましたが、彼はより速く、私は "盗む"が好きではありません:) – Vlasec

関連する問題