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文件中,僅僅返回值不同的兩個方法能共存的原因。