2017-03-06 50 views
3

我正在閱讀爲什麼Java中的數組協方差不好(Why are arrays covariant but generics are invariant?)。如果DogAnimal的子類型,則Dog[]Animal[]的子類型。這是一個問題,因爲可以這樣做:Java數組協變違反Liskov替換原則嗎?

Animal[] animals = new Dog[1]; 
animals[0] = new Cat(); 

這與正確實施的泛型不同。 A List<Dog>不是List<Animal>的子類型

我試圖理解爲什麼它不好並且剛剛閱讀了LSP的本質。它是否以任何方式違反LSP?似乎沒有明顯的違規行爲。

回答

4

它以任何方式違反LSP?

是的。

似乎沒有明顯的違規行爲。

您自己的示例是違規行爲。下面的代碼工作正常:

Animal[] animals = new Animal[1]; 
animals[0] = new Cat(); 

但如果現在更換Animal[]其亞型Dog[],代碼不再有效(即,它會導致當它以前不例外)。因此Dog[]型號不能用於任何超級類型爲Animal[]且違反LSP的地方。

爲了把這個在LSP的措辭:如果我們考慮物業「new Cat()可以被指定爲元素」,類型Animal[]滿足此屬性,但它的亞型Dog[]沒有。

相關問題