![](/img/trans.png)
[英]How to implement an arraylist from a superclass in the constructor of a subclass?
[英]Passing an ArrayList of subclass to a constructor that takes ArrayList of superclass?
好的,所以我正在為這所大學開展這個項目,我想我在這里做錯了,我猜我還沒有理解java繼承和類繼承。
我用這個小形式改寫了我的問題。
class SuperClass {
int dunno;
public SuperClass(int dunno) {
this.dunno = dunno;
}
}
class SubClass extends SuperClass {
int duncare;
public SubClass(int dunno, int duncare) {
super(dunno);
this.duncare = duncare;
}
}
class VeryBigClass {
ArrayList<SuperClass> superList;
public VeryBigClass(ArrayList<SuperClass> superList) {
this.superList = superList;
}
}
public void main(String[] args) {
new VeryBigClass(new ArrayList<SubClass>()); // this is the problematic line
}
}
簡而言之,我編寫了許多擴展一個通用類的類,並且在許多地方我使用超類(一般類)進行操作,而不是以相同的方式逐個處理每個子類。
但是我無法創建我需要的類的實例,因為構造函數將超類作為參數。 因為new VeryBigClass(new (ArrayList<SuperClass>)ArrayList<SubClass>());
我甚至不知道如何轉換它new VeryBigClass(new (ArrayList<SuperClass>)ArrayList<SubClass>());
顯然是錯的。 另外,這些實例的構建將在某個時候由json庫處理,所以我寧願不做這些花哨的東西......
如果你使用泛型,它應該工作得很好,不是一個超類列表而不是一個子類列表,但通用解決了這個:
class VeryBigClass<T extends SuperClass> {
ArrayList<T> superList;
public VeryBigClass(ArrayList<T> superList) {
this.superList = superList;
}
}
Java Tutorial在http://docs.oracle.com/javase/tutorial/java/generics/inheritance.html中解釋了這一點。
換句話說,如果您有具有繼承關系的類型,例如Sub extends Super
為泛型,則它們不會在包含它們的類中賦予繼承關系: Foo<Sub>
不是Foo<Super>
的子類型。
原因是它違反了泛型類型所包含的類型的承諾,違反了Liskov Substitution原則。 如果List<Sub>
擴展List<Super>
,則執行此操作是合法的:
List<Sub> subs = new ArrayList<Sub>();
List<Super> supers = subs;
Super super = new Super();
supers.add(super);
哇! 現在subs
有一個Super
類型的元素,完全違法!
因為ArrayList<Sub>
不是List<Super>
的子類型,所以在您調用時
new VeryBigClass(new ArrayList<SubClass>());
您將參數傳遞給不合法的構造函數。
你也可以使用通配符? extends super
? extends super
即任何擴展超級的類。
示例 :
class VeryBigClass {
ArrayList<? extends SuperClass> superList;
public VeryBigClass(ArrayList<? extends SuperClass> superList) {
this.superList = superList;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.