Java不允許Collection<Car>
作爲Collection<Vehicle>
的子類型。這是因爲Collection<Car>
不能用於代替每個Collection<Vehicle>
,因爲Collection<Vehicle>
可能包含車輛的其他子類型的元素,如摩托車,因此違反了Liskov替代原則?收藏品子類 - Liskov替換原理
回答
不完全。反過來:
那個Collection<Car>
只包含Car
s很好,即使Collection<Vehicle>
可能包含其他類型的車輛。你仍然可以給Collection<Car>
任何人誰可以處理Collection<Vehicle>
元素。
但Collection<Car>
不能代替Collection<Vehicle>
的使用,因爲你可以把一個Bicycle
成Collection<Vehicle>
(而不是在一個Collection<Car>
)。因此,您不能將Collection<Car>
交給想要收集車輛的人。
一般而言,Collection
由於存在「可選操作」而違反了Liskov替換原則,即突變方法可能無法用於特定實現。
關於類型安全,但是,它的工作原理這樣:
假設Car
是Vehicle
一個亞型,一個Collection<Car>
是一種類型的,它允許像
Collection<Car> c=…;
Car car=c.iterator().next();
的操作,其Collection<Vehicle>
沒有按」噸。在另一方面,Collection<Vehicle>
是一種類型的,它允許像
Collection<Vehicle> c=…;
Vehicle v=…;
c.add(v);
Collection<Car>
其不操作。因此,這些Collection
類型都不是另一個的子類型。
請參閱http://stackoverflow.com/questions/22050848/do-collections-unmodifiablexxx-methods-violate-lsp進行辯論集合突變方法是否違反LSP。 – jaco0646
Collection<T>
是一個類型的構造函數,所以Collection<Car>
是一種類型,而Collection<Vehicle>
是另一種類型。
現在的問題,如果Collection<Car>
可用於需要Collection<Vehicle>
,是一個方差的問題(協方差是這種情況)。
Liskov替代原則超越了類型一致性的方式,它不僅要求提供更多,要求更少,而且要保留超類型的合約,see Wikipedia。
請注意,Collection<Car>
是不變的在組件類型Car
上。因此,如果您想使用可能是汽車,自行車,火車等的車輛集合,則應該採取協同集合Collection<? extends Vehicle>
。
當然,如果你有應某處停放生產的汽車生產一個方法CarFactory
,一個逆變produce(Collection<? super Car>)
方法將是最有用的實現。
- 1. Liskov替代原理
- 2. 瞭解Liskov替代原理
- 3. Liskov替代原理示例
- 4. GoF生成器和Liskov替換原理
- 5. 理解Liskov替代原則
- 6. liskov替代原則和異常處理
- 7. 避免LSP(Liskov替換原則)違反
- 8. 這是違反Liskov替換原則嗎?
- 9. 面向對象的設計問題,Liskov替換原理
- 10. 在我的例子中違反了Liskov替換原則嗎?
- 11. 你能用一個好的C#例子來解釋Liskov替換原理嗎?
- 12. Liskov替代原則和鑄造
- 13. Liskov替代原則與多繼承heirachies
- 14. Java數組協變違反Liskov替換原則嗎?
- 15. GWT的ActivityMapper是否違反了Liskov替換原則?
- 16. Arrays.asList是否違反了Liskov替換原則?
- 17. 紅寶石類收藏品
- 18. 爲什麼InflaterInputStream#available()違反了Liskov替換原則?
- 19. 正在縮小的重寫方法參數類型Liskov替換原則違反?
- 20. 從收藏品收藏
- 21. 收集藏品
- 22. 是否有可能在構造函數中違反Liskov替換原則?
- 23. 如果違反Liskov替代原則,我該怎麼辦?
- 24. 如何在方法有可選參數時不違反Liskov替換原則?
- 25. Can Liskov替代原則應用(php示例)?
- 26. C#.NET中liskov原理的類型參數約束
- 27. 關於Liskov原理,我應該如何實現樹節點類?
- 28. 爲什麼不可變對象允許遵守Liskov替換原則?
- 29. Liskov替代原則 - 我在這裏違反了嗎?
- 30. ios子類化替代品
這與使用泛型和與之相關的協方差響應中的不變性挑戰更相關 – alainlompo