如何检查通用接口是否适合 class
How to check does interface with generic fit to class
我有一些通用类型的接口 interface DummyInterface<T>
我有 class 我必须设置接口
class DummyClass<T>{
public void setDummyInterface(DummyInterface<T> dummyInterface){
//set interface
}
}
想象一下我在 ArrayList
中存储 DummyClass
和不同泛型的情况。当我从列表中得到 class 时,我不知道 class 的泛型,我想检查接口是否具有相同的泛型;
例如我想像这样检查
if(dummyInterface<SomeTypeIKnow>.getGenericType() == dummyClass.getGenericType()){
dummyClass.setDummyInterface(dummyInterface);
}
不完全确定我理解你的问题,但这段代码将允许你获得对象的通用类型。它们允许您对对象的通用参数执行反射。
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class GenericClassUtils {
public static <T> Class<T> getClassFromGeneric(
Object parentObj,
int oridnalParamterizedTypeIndex) throws Exception{
Type[] typeArray = getParameterizedTypeListAsArray(parentObj);
return (Class<T>)typeArray[oridnalParamterizedTypeIndex];
}
public static <T> Type[] getParameterizedTypeListAsArray(Object parentObj){
return ((ParameterizedType) parentObj.getClass()
.getGenericSuperclass())
.getActualTypeArguments();
}
}
也许可以这样调用:
Class clazz = getClassFromGeneric(dummyClass, 0);
if (clazz.isInstance(SomeTypeIKnow.class)){
dummyClass.setDummyInterface(dummyInterface);
}
您可以使用 TypeTools 之类的东西来解析类型参数,只要参数在类型定义中被捕获即可。例如:
interface DummyStringInterface extends DummyInterface<String> {}
Class<?> t = TypeResolver.resolveRawArgument(DummyInterface.class, DummyStringInterface.class);
assert t == String.class;
我有一些通用类型的接口 interface DummyInterface<T>
我有 class 我必须设置接口
class DummyClass<T>{
public void setDummyInterface(DummyInterface<T> dummyInterface){
//set interface
}
}
想象一下我在 ArrayList
中存储 DummyClass
和不同泛型的情况。当我从列表中得到 class 时,我不知道 class 的泛型,我想检查接口是否具有相同的泛型;
例如我想像这样检查
if(dummyInterface<SomeTypeIKnow>.getGenericType() == dummyClass.getGenericType()){
dummyClass.setDummyInterface(dummyInterface);
}
不完全确定我理解你的问题,但这段代码将允许你获得对象的通用类型。它们允许您对对象的通用参数执行反射。
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class GenericClassUtils {
public static <T> Class<T> getClassFromGeneric(
Object parentObj,
int oridnalParamterizedTypeIndex) throws Exception{
Type[] typeArray = getParameterizedTypeListAsArray(parentObj);
return (Class<T>)typeArray[oridnalParamterizedTypeIndex];
}
public static <T> Type[] getParameterizedTypeListAsArray(Object parentObj){
return ((ParameterizedType) parentObj.getClass()
.getGenericSuperclass())
.getActualTypeArguments();
}
}
也许可以这样调用:
Class clazz = getClassFromGeneric(dummyClass, 0);
if (clazz.isInstance(SomeTypeIKnow.class)){
dummyClass.setDummyInterface(dummyInterface);
}
您可以使用 TypeTools 之类的东西来解析类型参数,只要参数在类型定义中被捕获即可。例如:
interface DummyStringInterface extends DummyInterface<String> {}
Class<?> t = TypeResolver.resolveRawArgument(DummyInterface.class, DummyStringInterface.class);
assert t == String.class;