2012-05-03 1 views
0

Javaはジェネリック型情報を公開します。実行時にフィールドjava.lang.reflect.Typeとそのサブインターフェース(ParameterizedType、WildcardType)を介してフィールドタイプのために。java.lang.reflect.Typeのオブジェクトを別のものにキャストできるかどうかをチェックするコンポーネントですか?

誰かが、あるタイプのオブジェクトを別のタイプにキャストできるかどうかを判断できるコンポーネントがどこにあるかを知っていますか? Set<Object>SetまたはComparator<User>にキャストすることができる場合は、Comparator<? extends Object>にキャストすることができますか?

溶液だけでなくClass ES、java.lang.reflect.Typeで表されるタイプの情報のために働く必要があり、それはすなわちList<Integer>List<Object>にキャストされるべきではなく、考慮ジェネリックを取るべきです。

よろしく、 ヨッヘン

答えて

3

Guava'sTypeToken中でも、まさにこの問題のために設計されています。ジェネリックを意識したClassの代わりとなることを意図しています。 (開示:私はGuavaに貢献します)

+0

両方を見ると、私はGuavaのアプローチが少し好きだと思う。純粋に主観的です。 – Jochen

+0

あなたは自分で決めなければならないので、Guillaumeの答えも見てください。 – Jochen

0
if (clazz.isAssignableFrom(otherClazz)) 
{ 
    return true; 
} 
+1

これは 'Class'オブジェクトでのみ有効で、' Type'では有効ではありません。ジェネリックを考慮しません。 – Jochen

3
+0

パーフェクト、ありがとう! – Jochen

+2

TypeUtils.isAssignable(...)を使用しても安全なキャストをチェックできないことを指摘します。たとえば、のコレクションからのリストへのキャストは完全に安全ですが、コレクションはリストには割り当てられません。元の質問は、isAssignableで十分であることを意味しますが、「キャスト」という言葉が一貫して使用されているので、言及する価値はあると思いました。 –

+0

「A」から「B」のうちの1つが他のものに割り当て可能であれば、それをキャストできます。 –

関連する問題