java 如何检查接口是否与类属匹配

mepcadol  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(89)

我有一个泛型类型为interface DummyInterface<T>的接口,还有一个必须设置接口的类

class DummyClass<T>{
        public void setDummyInterface(DummyInterface<T> dummyInterface){
            //set interface
        }
    }

假设我在ArrayList中存储了不同泛型的DummyClass,当我从list中获取class时,我不知道class的泛型,我想检查interface是否有相同的泛型;例如,我想这样检查

if(dummyInterface<SomeTypeIKnow>.getGenericType() == dummyClass.getGenericType()){
      dummyClass.setDummyInterface(dummyInterface);
}
hof1towb

hof1towb1#

你可以使用TypeTools(我编写的一个库)来解析类型参数,只要参数在类型定义中被捕获。

interface DummyStringInterface extends DummyInterface<String> {}

Class<?> t = TypeResolver.resolveRawArgument(DummyInterface.class, DummyStringInterface.class);
assert t == String.class;
deyfvvtc

deyfvvtc2#

我不太明白你的问题,但是这段代码可以让你得到一个对象的泛型类型,它们可以让你对一个对象的泛型参数进行反射。

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);
}

相关问题