我在尝试创建子类型类时遇到问题,并且使用某个泛型类型的对象的ArrayList调用其超级构造函数。我试图让这段代码工作。我希望我的SubTypes只接受 X 类型的 GenericObjects 列表。
public class SubType extends SuperType{
public SubType(ArrayList<GenericObject<Y>> g) {
super(g);
}
}
public class SuperType {
public ArrayList<GenericObject<?>> data = new ArrayList<GenericObject<? extends X>>();
public SuperType(ArrayList<GenericObject<? extends X>> series) {
data.addAll(series);
}
}
class GenericObject<T extends X>{}
class X{};
class Y extends X{};
我在调用super(g)时遇到错误。它说
构造函数 TestGenerics.SuperType(ArrayList的&GT) 未定义
这有点奇怪,因为我认为Generics允许这种事情。
如果我没有通过我的通用对象的ArrayList,只是传递通用对象,那就没问题了。
public class SubType extends SuperType{
public SubType(GenericObject<Y> g) {
super(g);
}
}
public class SuperType {
public ArrayList<GenericObject<?>> data = new ArrayList<GenericObject<? extends X>>();
public SuperType(GenericObject<? extends X> series) {
data.add(series);
}
}
class GenericObject<T extends X>{
}
class X{};
class Y extends X{};
以上工作完美。有没有办法让第一个例子起作用?
答案 0 :(得分:2)
即使ArrayList<Child>
扩展ArrayList<Parent>
,您的问题仍然是Child
不会延伸Parent
。
但是,您之前处于正确的轨道上,因为ArrayList<Child>
确实扩展了ArrayList<? extends Parent>
。
您只需要再次重复? extends ...
模式,就像这样:
public SuperType(ArrayList<? extends GenericObject<? extends X>> series) {
data.addAll(series);
}
这对我来说很好。
更新:完整代码如下所示:
public class SubType extends SuperType{
public SubType(ArrayList<GenericObject<Y>> g) {
super(g);
}
}
public class SuperType {
public ArrayList<GenericObject<?>> data = new ArrayList<GenericObject<? extends X>>();
public SuperType(ArrayList<? extends GenericObject<? extends X>> series) {
data.addAll(series);
}
}
class GenericObject<T extends X>{}
class X{};
class Y extends X{};
答案 1 :(得分:2)
您是否正在寻找此解决方案?
class SubType extends SuperType<Y> {
public SubType(List<GenericObject<Y>> g) {
super(g);
}
}
class SuperType<T extends X> {
public List<GenericObject<T>> data = new ArrayList<GenericObject<T>>();
public SuperType(List<GenericObject<T>> series) {
data.addAll(series);
}
}
class GenericObject<T extends X>{}
class X{};
class Y extends X{};