[英]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.