所以我在Java中有这个类:
public class Foo<T>{
}
在这个类里面我想知道T是否实现了某个接口。
以下代码不起作用,但它是我想要完成的想法:
if(T.class implements SomeInterface){
// do stuff
}
所以我想检查传递给Foo的类T
是否在其签名上有implements SomeInterface
。
有可能吗?怎么样?
答案 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));
其中tClazz
是java.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
}