可以使用函数查看推断泛型类型。
getGenericSuperclass
然后
getActualTypeArguments
下面是一个例子:
// Given that all classes in this set are actually subclasses of ClassBase
Set<Class<? extends ClassBase>> classes = Set.of(ClassA.class, ClassB.class, ClassC.class);
System.out.println(classes); // [class test.ClassB, class test.ClassA, class test.ClassC]
@SuppressWarnings("unchecked")
Set<Class<? extends ClassBase<Long>>> result = classes.stream()
.filter(cls -> {
// Get superclass, which is ClassBase, so assume it's also parameterized
ParameterizedType superClass = (ParameterizedType) cls.getGenericSuperclass();
Type inferred = superClass.getActualTypeArguments()[0]; // get first type argument
return inferred == Long.class; // check if it's 'Long'
})
// Can now say they all extend ClassBase<Long>
.map(cls -> (Class<? extends ClassBase<Long>>) cls)
.collect(Collectors.toSet());
System.out.println(result); // [class test.ClassA, class test.ClassB]
你得到一个
Set<Class<? extends ClassBase<Long>>>
它包含扩展的类
ClassBase<Long>
。一
Set<Class<ClassBase<Long>>>
,你要求的,应该只在技术上
ClassBase
当你对子类感兴趣的时候
Class<? extends ClassBase<Long>>
.