だから私はJavaでこのクラスを持っています:
public class Foo<T>{
}
このクラスの中で、Tが特定のインターフェイスを実装しているかどうかを知りたいです。
次のコードは機能しませんが、それは私が達成したいことのアイデアです:
if(T.class implements SomeInterface){
// do stuff
}
fooに渡されたクラスT
にimplements SomeInterface
その署名。
出来ますか?どうやって?
ジェネリックは、奇妙なことに、インターフェイスにもextends
を使用します。1 あなたは使いたいでしょう:
public class Foo<T extends SomeInterface>{
//use T as you wish
}
これは実際には実装の要件ですtrue/falseチェックではない。
True/falseチェックの場合は、制限のないジェネリックス(class Foo<T>{
)を使用し、Class<T>
を取得して、修正可能なタイプを取得します。
if(SomeInterface.class.isAssignableFrom(tClazz));
ここで、tClazz
はタイプJava.lang.Class<T>
のパラメーターです。
Refiable型のパラメーターを取得する場合、それは次のものにすぎません。
if(tParam instanceof SomeInterface){
しかし、これは一般的な宣言だけでは機能しません。
1クラスと複数のインターフェースを拡張する必要がある場合は、次のように実行できます。<T extends FooClass & BarInterface & Baz>
クラス(Javaには複数の継承がないため、1つだけ)はfirstでなければなりません。その後のインターフェースは任意の順序で。
isAssignableFromを使用して確認できます
if (YourInterface.class.isAssignableFrom(clazz)) {
...
}
またはインターフェイスの配列を取得するには
Class[] intfs = clazz.getInterfaces();