gpt4 book ai didi

java - Java中的泛型,返回泛型类Set的集合

转载 作者:行者123 更新时间:2023-12-02 10:32:40 25 4
gpt4 key购买 nike

所以我有这段代码,我试图返回一组扩展另一个类的类

public static <T> Set<T> getClassesExtending(Class<T> clazz) {
Reflections reflections = new Reflections("");
Set<Class<? extends T>> classes = reflections.getSubTypesOf(clazz);

if (classes.size() <= 0) return new HashSet<>();

Set<T> extending = classes.stream().filter(c -> c instanceof T).collect(Collectors.toSet());

return extending;
}

问题:

c instanceof T //shows compile error 'Class or array expected' above 'T'

例如,如果我要写...

getClassesExtending(MyClass.class).forEach(c -> c.methodInMyClass())

它会起作用的。有什么建议吗?

最佳答案

  • 首先,从您所描述的使用方式来看,您想要
    • 查找扩展类的类 clazz
    • 使用默认构造函数创建对象,然后
    • 调用它们的方法。

这段代码应该可以完成你的工作

public static <T> Set<? extends T> getClassesExtending(Class<T> clazz) {
Reflections reflections = new Reflections("");
Set<Class<? extends T>> classes = reflections.getSubTypesOf(clazz);

if (classes.size() <= 0) return new HashSet<>();

Set<? extends T> extending =
classes.stream().map(aClass -> {
try {
return aClass.getConstructor().newInstance();
} catch (Exception e) {
return null;
}
}).collect(Collectors.toSet());
return extending;
}

我建议你输入 filter()操作过滤掉任何没有无参数构造函数的子类,以防止 null位于 extending设置。

  • 其次,当你这样做时

    Set<T> extending = classes.stream().filter(c -> c instanceof T).collect(Collectors.toSet());

如果您实际上尝试将集合过滤为类,则该操作将是幂等的,即它不会在集合中产生任何更改。

最后来说一下原因c instanceof T导致编译错误的原因是instanceOf运算符不允许在其 rhs 上使用不可引用类型,并且泛型类型是不可引用的。 (JLS 11 section: 15.20.2)

关于java - Java中的泛型,返回泛型类Set<T>的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53515986/

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