回答
因爲那叫做overloading。
特別是,返回類型可以是協變的,因爲它在重載時不被考慮,因此它仍然匹配超類或接口的實現。超載時會考慮參數。與Number doSomethingWithNumber(Number value)
相比,您很可能會對Number doSomethingWithNumber(Integer value)
進行優化。
假設它具有逆變參數仍然是壓倒性的,我們會遇到什麼問題?我正在尋找像這樣的東西:http://stackoverflow.com/a/2996901/715236,但是如果有一個子類中的方法在超類中覆蓋多個,會有什麼不好? – Will
最大的問題是無法在鏈中某處發生任何基本類型過載時提供重載。這會破壞多態函數調用,因爲查找必須從簡單的等號簽名變爲相同或更基本的簽名,並且如果您同時具有相同或更基本的簽名,應該調用什麼函數,而是調用更具體的函數呢?從設計的角度來看,如果'A擴展B','B擴展C',但'B'從鏈接提供'void f(Object o)'實現,那麼'A'沒有機會實現更多特定的重載方法。這將是一場噩夢。 – pickypg
最重要的是,我認爲這會導致API被延遲地覆蓋,這會導致很多令人難以置信的醜陋的,樣板代碼在內部被用來調用適當的方法:void f(Object o){if( o整型實例)f((Integer)o); }'。然後你不得不問,甚至會如何工作?爲了允許重載行爲,這意味着'Object'參數方法會覆蓋'Integer'參數方法,因此上面的代碼會導致無限的遞歸循環(直到堆棧溢出),因爲它會回落到'對象'方法。 – pickypg
- 1. 爲什麼Java不允許基於類型參數的重載?
- 2. 爲什麼這種類型不允許使用類型參數?
- 3. 爲什麼Ruby 1.9允許覆蓋! !=!〜?
- 4. Java中的逆變類型參數?
- 5. 爲什麼java不允許繼承類型作爲重寫方法的參數?
- 6. 爲什麼java不允許使用帶super關鍵字的類型參數?
- 7. 爲什麼ReSharper建議我讓類型參數T逆變?
- 8. 在Java方法重載爲什麼允許有協變返回類型,但不是協變的參數?
- 9. 爲什麼一個接口參數允許任何類型
- 10. 爲什麼在Scala輔助構造函數中不允許類型參數?
- 11. 爲什麼函數[-A1,...,+ B]不允許任何超類型作爲參數?
- 12. 爲什麼不委託使用值類型的逆變函數?
- 13. 爲什麼原始數據類型在java.util.ArrayList中不允許?
- 14. 允許按派生類訪問,但不允許覆蓋
- 15. 爲什麼socketpair()允許SOCK_DGRAM類型?
- 16. 爲什麼在模板參數中不允許使用類型對象?
- 17. 爲什麼svn允許覆蓋以前的提交?
- 18. 爲什麼C++不允許參數成爲默認參數?
- 19. 我們爲什麼不能覆蓋Java中的變量
- 20. 爲什麼java允許NPE
- 21. 爲什麼通用類型參數的類允許在類內拋出
- 22. 爲什麼這些逆變參數類型被認爲是安全的?
- 23. 爲什麼子類不會覆蓋其超類變量的值?
- 24. 爲什麼python允許覆蓋內建常量?
- 25. 爲什麼C不允許數組返回類型?
- 26. 爲什麼編譯器允許引用未被參數化的泛型類型?
- 27. 爲方法參數設置允許的變量類型
- 28. 爲什麼Java不允許以
- 29. 允許參數/選項覆蓋位置參數
- 30. 爲什麼變量不允許綁定
可能的重複[爲什麼沒有重寫的參數反差?](http://stackoverflow.com/questions/2995926/why-is-there-no-parameter-contra-variance-for-overriding) –
謝謝。我已經看到了這一點,但很難理解C++中的答案,因爲我完全不熟悉C++。認爲專門尋找Java可能更容易。 – Will
我閱讀鏈接的帖子,據我瞭解,從這個功能獲得的收益並不超過驚喜因素。爲特定實現提供重載方法並不難。我的意思是你看到了這個功能的其他用例嗎?除了直接調用類的方法? –