【发布时间】:2018-11-28 09:21:17
【问题描述】:
所以我有这段代码,我试图返回一组扩展另一个类的类
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())
它会起作用的。有什么建议吗?
【问题讨论】:
-
只要使用
filter(clazz::isInstance) -
如何从
Stream<Class<? extends T>>获得Set<T>? -
试过
filter(clazz::isInstance)但它显示此错误“不兼容的类型。必需的 Set但 'collect' 被推断为 R:不存在类型变量的实例,因此 Class extends T> 符合 T 推理变量 T 具有不兼容的界限:等式约束:T 下界:Class extends T>" -
在
filter(c -> c instanceof T)中,参数c的类型为Class<? extends T>,因此永远不可能是instanceof T,因为Class类不是从T 派生的。 -
getSubTypesOf方法返回类java.lang.Class的实例,这与您正在寻找的类的实例完全不同。您没有任何A的实例,您只有Class<A>的实例,并且这些实例与A 类无关。