由于 Java 泛型处理,Class<List<Integer>>
无法获得一个类(没有未经检查的强制转换),但将是Class<List>
or Class<List<?>>
。
因此,如果您正在使用参数化类型ElementProcessor
,我建议您将方法更改为Class<? super T> getElementClass()
两个示例:
interface MyElementProcessor<T> {
void doSomethingWith(T element);
Class<? super T> getElementClass();
/* more functions... */
}
SimpleElementProcessor implements MyElementProcessor<Integer> {
public void doSomethingWith(Collection<Integer> element) { /* ... */ }
public Class<Integer> getElementsClass() {
return Integer.class;
}
}
CollectionElementProcessor<E> implements MyElementProcessor<Collection<E>> {
public void doSomethingWith(Collection<Collection<E>> element) { /* ... */ }
// This works because Class<Collection<?>> is a valid substitute for Class<? super T>
public Class<Collection<?>> getElementsClass() {
return (Class<Collection<?>>) Collection.class; // Maybe the cast isn't needed
}
}
至于获取元素类,您可以使用反射:如果您的类型派生MyElementProcessor,您可以像这样获取它:
for(Type interface : getClass().getGenericInterfaces()) {
if(interface instanceof ParameterizedType && ((ParameterizedType) interface).getRawType == MyElementProcessor.class)
Type myElementsType = ((ParameterizedType) interface).getActualTypeArguments()[0];
这仅适用于派生类,即匿名类或声明的类型,如果由于类型擦除而以这种方式使用它,它将不起作用(此示例是虚拟的:它只是一个示例):
public <T> MyElementProcessor newInstance() {
return new MyElementProcessor<T> {
// overridden methods ...
};
}
在这种情况下,您将:
- 不获取 ParameterizedType 而是直接获取 MyElementProcessor.class,其类型参数是 TypeVariable 并且不为您提供它的实际类型实现
- 获取原始类型为 MyElementProcessor 且实际类型参数为 TypeVariable 的 ParameterizedType