2017-05-27 121 views
3

好吧,我正在爲這所大學的這個項目工作,我想我在這裏做錯了什麼,我猜想我沒有足夠的理解java的繼承和類繼承。將一個ArrayList的子類傳遞給一個構造函數,該構造函數接受超類的ArrayList?

我改寫了這個小表單中的問題。

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>());顯然是錯誤的。另外,這些實例的構建將由json庫在某些時候處理,所以我寧願不做這樣的花哨的東西...

回答

6

如果您使用泛型,它應該工作得很好,不是一樣的超類不是子類的名單列表,但一般的解決這個問題:

class VeryBigClass<T extends SuperClass> { 

    ArrayList<T> superList; 

    public VeryBigClass(ArrayList<T> superList) { 
     this.superList = superList; 
    } 
} 
+0

但你沒有解釋爲什麼! –

3

Java教程解釋這http://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

底線,如果你有類型的繼承關係,喜歡Sub extends Super爲仿製藥,他們做而不是授予繼承relati在持有它們的課程中進行授課:Foo<Sub>不是Foo<Super>的子類型。

原因是它違反了通用類型包含的類型的承諾,違反了Liskov替換原則。如果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>()); 

你傳遞參數給是不合法的構造。

2

您也可以使用通配符? extends super也就是說,任何擴展超類的類。

class VeryBigClass { 

    ArrayList<? extends SuperClass> superList; 

    public VeryBigClass(ArrayList<? extends SuperClass> superList) { 
     this.superList = superList; 
    } 
} 
+0

聲明類型的通配符有點冒險。它們適用於方法參數和返回類型,因爲那些提供更好聲明的提要類型,但是作爲變量類型,它們提供的信息太少。最好遵循前面給出的建議來讓'VeryBig'成爲一個通用類。 –

+0

哦,不知道有人能做到這一點!這將有助於肯定,謝謝:) –

相關問題