27

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

public class Foo<T>{
}

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

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

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

TFoo に渡されたクラスimplements SomeInterfaceに署名があるかどうかを確認したいと思います。

出来ますか?どのように?

4

3 に答える 3

56

ジェネリックは、奇妙なことにextends、インターフェイスにも使用されます。1使用したいもの:

public class Foo<T extends SomeInterface>{
    //use T as you wish
}

これは実際には実装の要件であり、true/false チェックではありません。

true/false チェックの場合は、unbounded generics( class Foo<T>{) を使用し、 a を取得しClass<T>て、refiable 型を取得していることを確認します。

if(SomeInterface.class.isAssignableFrom(tClazz));

ここtClazzで、 は type のパラメーターですjava.lang.Class<T>

再定義可能な型のパラメーターを取得した場合、それは次のとおりです。

if(tParam instanceof SomeInterface){

しかし、これはジェネリック宣言だけでは機能しません。

1クラスと複数のインターフェースを拡張する必要がある場合は、次<T extends FooClass & BarInterface & Baz>のように実行できます。クラス (Java には多重継承がないため、1 つだけ) を最初に配置し、その後のインターフェースを任意の順序で配置する必要があります。

于 2013-09-13T10:22:48.160 に答える
4

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

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

またはインターフェイスの配列を次のように取得します

Class[] intfs = clazz.getInterfaces();
于 2013-09-13T10:23:50.157 に答える
0

使用するisAssignableFrom()

isAssignableFrom()は、この Class オブジェクトによって表されるクラスまたはインターフェースが、指定された Class パラメーターによって表されるクラスまたはインターフェースと同じであるか、またはそれらのスーパークラスまたはスーパーインターフェースであるかを判別します。

if (SomeInterface.class.isAssignableFrom(T class)) {
  //do stuff
}
于 2013-09-13T10:25:00.807 に答える