检查通用T是否实现了接口

时间:2013-09-13 10:19:19

标签: java class generics interface implements

所以我在Java中有这个类:

public class Foo<T>{
}

在这个类里面我想知道T是否实现了某个接口。

以下代码不起作用,但它是我想要完成的想法:

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

所以我想检查传递给Foo的类T是否在其签名上有implements SomeInterface

有可能吗?怎么样?

3 个答案:

答案 0 :(得分:39)

泛型,奇怪的是,也使用extends作为接口。 1 你想要使用:

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

这实际上是实施的要求,不是真/假检查

对于真/假检查,请使用无界泛型(class Foo<T>{),并确保获得Class<T>,以便您有一个可靠的类型:

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

其中tClazzjava.lang.Class<T>类型的参数。

如果你得到一个可反复类型的参数,那么它只不过是:

if(tParam instanceof SomeInterface){

但这不仅适用于通用声明。

1 如果您想要扩展一个类和多个接口,您可以执行以下操作:<T extends FooClass & BarInterface & Baz>该类(只有一个,因为Java中没有多重继承)必须 first ,以及之后的任何接口。

答案 1 :(得分:4)

您可以使用isAssignableFrom

进行检查
if (YourInterface.class.isAssignableFrom(clazz)) {
    ...
}

或将接口数组作为

Class[] intfs = clazz.getInterfaces();

答案 2 :(得分:-1)

使用isAssignableFrom()

isAssignableFrom()确定此Class对象所表示的类或接口是否与指定的Class参数所表示的类或接口相同,或者是它们的超类或超接口。

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