【发布时间】:2021-03-07 05:51:22
【问题描述】:
我有以下类层次结构:
public abstract class MyParentObject {}
public abstract class MyObject<T> extends MyParentObject {}
public abstract class MyParentContainer<T extends MyParentObject> {
private Class<T> valueType;
protected MyParentContainer(Class<T> valueType) {
this.valueType = valueType;
}
}
public abstract class MyObjectContainer<T extends MyObject<?>> extends MyParentContainer<T> {
protected MyObjectContainer(Class<T> valueType) {
super(valueType);
}
}
到目前为止,这工作正常。 MyObject 有几个子类和几个容器类,其中一些子类为 valueType,例如
public class IntObject extends MyObject<Integer> {}
public class IntContainer extends MyObjectContainer<IntObject> {
public IntContainer() {
super(IntObject.class);
}
}
现在我需要实现一个容器,尽管它适用于MyObject 的混合子类集。
public class AllObjectContainer extends MyObjectContainer<MyObject<?>> {
public AllObjectContainer() {
super(MyObject.class); // compile error here
}
}
这不会编译,因为“构造函数 MyObjectContainer
为了解决这个问题,我可以使用原始类型:
- 将
public class AllObjectContainer extends MyObjectContainer<MyObject<?>>更改为public class AllObjectContainer extends MyObjectContainer<MyObject>
由于类型擦除,这会产生后果,所以我不喜欢这种解决方案。
或者我可以通过
启用投射- 将
protected MyObjectContainer(Class<T> valueType) {更改为protected MyObjectContainer(Class<? extends T> valueType) {(添加? extends) - 将
super(MyObject.class)更改为super((Class<? extends MyObject<?>>) MyObject.class)
此方法有效,但转换标记为未选中,更改 MyMiddleContainer-Constructor 对扩展它的其他类有潜在的副作用。
有没有更好的解决方案?
【问题讨论】:
-
为什么需要
Class对象?你用它做什么?
标签: java generics inheritance reflection