2014-02-27 94 views
1

的ArrayList拋出ClassCastException我不知道如何字這個稱號,但現在的問題是與擴展的對象

我有對象B的ArrayList

對象B擴展對象A

我想要將對象A的元素添加到ArrayList。我覺得我應該能夠做到這一點,因爲對象A是一個簡單版本的對象B(或者我應該說,對象B是對象A的一個子集)

但是我得到ClassCastException,這是什麼解決方案同時將擴展對象保持爲獨立的對象。

+0

如果B擴展A,不應該是A類型的列表嗎? – FatalError

+0

@FatalError應該嗎?我的意思是,如果這就是答案發布 – CQM

+0

向我們展示給你一個'ClassCastException'的代碼。 –

回答

3

作爲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()); 
1

如果您有一個ArrayList<B>,您可以添加任何B s和B的子類。但是您不能添加A,因爲A不是B的子類。

如果要混合A s和B s,請嘗試ArrayList<A>。在這裏你可以添加兩者,因爲BA的子類。當使用多態時,總是用最普通的類作爲參數來聲明你的通用數據。