web-dev-qa-db-ja.com

ジェネリックTがインターフェイスを実装しているかどうかを確認する

だから私はJavaでこのクラスを持っています:

public class Foo<T>{
}

このクラスの中で、Tが特定のインターフェイスを実装しているかどうかを知りたいです。

次のコードは機能しませんが、それは私が達成したいことのアイデアです:

if(T.class implements SomeInterface){
    // do stuff
}

fooに渡されたクラスTimplements SomeInterfaceその署名。

出来ますか?どうやって?

19
Budius

ジェネリックは、奇妙なことに、インターフェイスにも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でなければなりません。その後のインターフェースは任意の順序で。

39
Andrey Akhmetov

isAssignableFromを使用して確認できます

if (YourInterface.class.isAssignableFrom(clazz)) {
    ...
}

またはインターフェイスの配列を取得するには

Class[] intfs = clazz.getInterfaces();
4
muthu