簡體   English   中英

將子類的ArrayList傳遞給一個采用超類ArrayList的構造函數?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM