所以我在Java中有这个类:
public class Foo<T>{
}
在这个类中,我想知道 T 是否实现了某个接口。
以下代码不起作用,但这是我想要完成的想法:
if(T.class implements SomeInterface){
// do stuff
}
所以我想检查T
传递给 Foo 的类是否有implements SomeInterface
它的签名。
可能吗?如何?
所以我在Java中有这个类:
public class Foo<T>{
}
在这个类中,我想知道 T 是否实现了某个接口。
以下代码不起作用,但这是我想要完成的想法:
if(T.class implements SomeInterface){
// do stuff
}
所以我想检查T
传递给 Foo 的类是否有implements SomeInterface
它的签名。
可能吗?如何?
奇怪的是,泛型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中没有多重继承)必须在前,然后任何接口以任意顺序排列。
您可以使用 isAssignableFrom 检查它
if (YourInterface.class.isAssignableFrom(clazz)) {
...
}
或将接口数组作为
Class[] intfs = clazz.getInterfaces();
利用isAssignableFrom()
isAssignableFrom()确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。
if (SomeInterface.class.isAssignableFrom(T class)) {
//do stuff
}