的ArrayList拋出ClassCastException我不知道如何字這個稱號,但現在的問題是與擴展的對象
我有對象B的ArrayList
對象B擴展對象A
我想要將對象A的元素添加到ArrayList
。我覺得我應該能夠做到這一點,因爲對象A是一個簡單版本的對象B(或者我應該說,對象B是對象A的一個子集)
但是我得到ClassCastException
,這是什麼解決方案同時將擴展對象保持爲獨立的對象。
的ArrayList拋出ClassCastException我不知道如何字這個稱號,但現在的問題是與擴展的對象
我有對象B的ArrayList
對象B擴展對象A
我想要將對象A的元素添加到ArrayList
。我覺得我應該能夠做到這一點,因爲對象A是一個簡單版本的對象B(或者我應該說,對象B是對象A的一個子集)
但是我得到ClassCastException
,這是什麼解決方案同時將擴展對象保持爲獨立的對象。
作爲Liskov substitution principle狀態:
在一個計算機程序中,如果S是T的子類型,則類型T 的對象可以與類型的對象替換S.
即也就是說,如果如果您有:
class Animal {}
class Dog extends Animal {}
是情理之中的事:
Animal animal = new Dog();
,但它是錯誤的事:
Dog dog = new Animal();
這是你在做什麼。你可能試圖達到的是:
List<Animal> list = new ArrayList<Animal>();
list.add(new Animal());
list.add(new Dog());
如果您有一個ArrayList<B>
,您可以添加任何B
s和B
的子類。但是您不能添加A
,因爲A
不是B
的子類。
如果要混合A
s和B
s,請嘗試ArrayList<A>
。在這裏你可以添加兩者,因爲B
是A
的子類。當使用多態時,總是用最普通的類作爲參數來聲明你的通用數據。
如果B擴展A,不應該是A類型的列表嗎? – FatalError
@FatalError應該嗎?我的意思是,如果這就是答案發布 – CQM
向我們展示給你一個'ClassCastException'的代碼。 –