Check if a generic T implements an interface

≡放荡痞女 提交于 2019-12-03 16:29:52

问题


so I have this class in Java:

public class Foo<T>{
}

and inside this class I want to know if T implements certain interface.

The following code DOES NOT work but it's the idea of what I want to accomplish:

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

so I want to check if the class T that was passed to Foo have implements SomeInterface on its signature.

Is it possible? How?


回答1:


Generics, oddly enough, use extends for interfaces as well.1 You'll want to use:

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

This is actually a requirement for the implementation, not a true/false check.

For a true/false check, use unbounded generics(class Foo<T>{) and make sure you obtain a Class<T> so you have a refiable type:

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

where tClazz is a parameter of type java.lang.Class<T>.

If you get a parameter of refiable type, then it's nothing more than:

if(tParam instanceof SomeInterface){

but this won't work with just the generic declaration.

1If you want to require extending a class and multiple interfaces, you can do as follows: <T extends FooClass & BarInterface & Baz> The class(only one, as there is no multiple inheritance in Java) must go first, and any interfaces after that in any order.




回答2:


you can check it using isAssignableFrom

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

or to get the array of interface as

Class[] intfs = clazz.getInterfaces();



回答3:


Use isAssignableFrom()

isAssignableFrom() determines if the class or interface represented by this Class object is either the same as, or is a superclass or superinterface of, the class or interface represented by the specified Class parameter.

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


来源:https://stackoverflow.com/questions/18783916/check-if-a-generic-t-implements-an-interface

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!