JAVA中當泛型遇到重載


class Test1{
     public  void sum(List<Integer> list) {
     }
     public  void sum(List<String> list) {
     
     }
}

此時編譯器會報錯,因為java的泛型是偽泛型(c#是真泛型),為什么說是偽泛型呢?
因為Java泛型只存在於源代碼中,編譯后,泛型信息已經被"擦除"了。編譯后類似:

class Test1{
     public  void sum(List<E> list) {
     }
     public  void sum(List<E> list) {
     
     }
}

兩個函數具有相同的簽名,當然編譯器會拒絕為我們編譯這樣的代碼。

class Test2{
     public  Integer sum(List<Integer> list) {
     }
     public  String sum(List<String> list) {
     
     }
}

這段代碼能正常編譯嗎?答案是,這段代碼能正常編譯(重載成功了)。而且還能正常執行!

jvm規定,函數的返回類型並不參與“函數特征簽名”的生成,那為什么能編譯成功呢?
是因為在class文件中,只要描述符不完全一致的兩個方法就能共存於一個class文件中。
字節碼中,特征簽名還包括了方法的返回值以及受查異常表,這就是為什么在class文件中,僅僅返回值不同的兩個方法能共存的原因。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM