检查泛型 T 是否实现了接口

2022-09-01 11:33:03

所以我在Java中有这个类:

public class Foo<T>{
}

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

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

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

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

可能吗?如何?


答案 1

奇怪的是,泛型也用于接口。1 您需要使用:extends

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 个如果要要求扩展一个类和多个接口,可以执行以下操作:类(只有一个,因为在Java中没有多重继承)必须放在第一位,之后的任何接口必须以任何顺序进行。<T extends FooClass & BarInterface & Baz>


答案 2

您可以使用 isAssignableFrom 进行检查

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

或者获取接口数组作为

Class[] intfs = clazz.getInterfaces();