2012-03-20 3 views

答えて

6

<T>は、例えば、それは全体ではなくクラスに定義されたものに頼るの、独自の型パラメータを定義する一般的な方法であることがJavaの指示

public class Stuff<T> {}

2

それは本当に全く役に立ちません。

コールサイトでは、typeパラメータを持つListに結果を割り当てることができます。これはタイプセーフではありません。このコードはすべて、あなたにセキュリティの誤った感覚を与えるだけです。それが返された場合、例えば、書かれたようList<String>は、あなたはList<Integer>にその結果を割り当てることが許可されると、あなたがしようとするが(ずっと後になるまでめちゃくちゃにしました知っているとListの要素にアクセスしません。それをIntegerに割り当てます)、暗黙のキャストがあなたの顔に爆発します。

通常、ジェネリックメソッド(たとえば、独自の型パラメータを持つクラスとは別の型パラメータを持つメソッド)は、型パラメータを一度しか使用しない、または戻り値としてのみ使用する場合は、時間の!

+0

残念ながら、これはプレーン 'List'を返す従来のAPIを扱うの少なくとも痛みを伴う方法ですが、あなたが本当にそれという_know_を'List 'を返します。 – mitchnull

+0

私は@mitchnullに同意します。ここでも同じことが起こっています:http://stackoverflow.com/questions/115692/how-to-avoid-type-safety-warnings-with-hibernate-hql-resultsそしてここに起こっていることについての洞察をありがとう! – brainydexter

+0

それはおそらく唯一の有効な使用 – dty

0

これは、listAndCastがTタイプに依存する汎用メソッドであることをjavaに伝えます。

サイドノート:それはより一般的だと私は、この問題のために、この実装を好む:

@SuppressWarnings("unchecked") 
public <T> List<T> list_cast(List<?> orig) { 
    return (List<T>)orig; 
} 
+0

これを渡って来て、あなたが興味を持っているかもしれないと思った:http://stackoverflow.com/a/115952/280924 – brainydexter

0

あなたは<T>を必要としないが、それはコンパイラの警告を停止しません。コンパイラはList<Object>が返されることを推論します(返される型に関する他の情報はありません)。

それは本質的に同じです:生タイプについての警告なし

public static List listAndCast(Query query) 

<T>渡される引数は、<T>でパラメータされた場合に便利かもしれません。例:

public static <T> List<T> listAndCast(Query<T> query) 
+0

タイプを渡さないと、キャストのターゲットタイプをどのように知っていますか?引数? – Gabber

関連する問題