gpt4 book ai didi

java - 从 Class 获取子类

转载 作者:行者123 更新时间:2023-12-01 22:44:57 24 4
gpt4 key购买 nike

我有一个项目,其中服务接口(interface)用 @Service 进行注释注解(自定义注解,不是 Spring),每个服务可以有多个实现(hibernate、mongodb 等)。

我正在尝试使用反射加载实现类,如下所示:

第1步:加载所有带有@Service的接口(interface)注释

第 2 步:加载每个接口(interface)的所有子类

这是代码:

public static void main(String[] args) throws Exception{
Reflections reflections = new Reflections("net.jitix.cfs");
//load annotated interfaces
Set<Class<?>> types=reflections.getTypesAnnotatedWith(Service.class);

Iterator<Class<?>> typeIterator=types.iterator();

typeIterator.forEachRemaining(new Consumer<Class<?>>() {

@Override
public void accept(Class<?> type) {
if(!type.isInterface()){
typeIterator.remove();
}
}
});

for(Class<?> type:types){
//load implementation classes
Set<Class<?>> implTypes=reflections.getSubTypesOf(type); //error here
}

//rest of the code
}

我收到的编译错误:Type mismatch: cannot convert from Set<Class<? extends capture#8-of ?>> to Set<Class<?>>

根据我的 understanding Class<?>表示类型可以是任何类型,所以我很困惑为什么需要 Class<T> 的方法不能拿Class<?>作为参数。

有人可以帮我理解为什么会发生这种情况吗?我的方法有其他可能的替代方案吗?提前致谢!

编辑:根据@MGorgon的评论以及@StriplingWarrior和@Sotirios Delimanolis的回答,使用反射方法是毫无疑问的。有什么方法可以获取引用类型为 Class<?> 的类型的子类型吗?

最佳答案

这个问题的关键与反射无关,而是协变/逆变。它有效地:

Why can't I assign a Set<? extends Something> to a Set<?>?

答案是,如果您有 Set<?>那么编译器会让您将任何类型的对象(例如 X )添加到该集合中,并且有人尝试从原始 Set<? extends Something> 检索该值当发现您的 X 时,会出现运行时错误不延长 Something

原理可以更简单地演示如下:

Set<Dog> dogs = getDogs();
Set<Pet> pets = dogs; // the compiler will complain here
pets.add(new Cat("Fluffy")); // to avoid letting this happen
for(Dog dog : dogs) // which would cause an exception here
{
...
}

由于您(大概)知道您不打算向该集合添加任何内容,因此通过一些显式转换告诉编译器您知道自己在做什么可能是安全的:

Set<Class<?>> implTypes= (Set<Class<?>>)(Set<?>)reflections.getSubTypesOf(type);

关于java - 从 Class<?> 获取子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25515860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com