[英]Trying to sub-type classes using generics
我在尝试创建子类型类并用某个通用类型的对象的ArrayList调用其超构造函数时遇到问题。 我正在尝试使此代码正常工作。 我希望我的子类型仅接受类型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>)未定义
那有点奇怪,因为我认为泛型允许这种事情。
如果我不传递通用对象的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{};
以上完美地工作。 有什么方法可以使第一个示例生效?
您的问题是,即使Child
扩展Parent
, ArrayList<Child>
也不会扩展ArrayList<Parent>
。 但是,您之前走在正确的轨道上,因为ArrayList<Child>
确实扩展了ArrayList<? extends Parent>
ArrayList<? extends Parent>
。
您只需要重复您的? extends ...
? 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{};
您是否正在寻找这种解决方案?
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{};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.