27

所以我在Java中有这个类:

public class Foo<T>{
}

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

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

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

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

可能吗?如何?

4

3 回答 3

56

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

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

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

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

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

其中tClazz是类型的参数java.lang.Class<T>

如果你得到一个 refiable 类型的参数,那么它无非是:

if(tParam instanceof SomeInterface){

但这不适用于泛型声明。

1如果需要扩展一个类和多个接口,可以这样做:<T extends FooClass & BarInterface & Baz>类(只有一个,因为Java中没有多重继承)必须在前,然后任何接口以任意顺序排列。

于 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 回答