日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

当泛型遇到重载

發布時間:2025/3/12 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 当泛型遇到重载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

當泛型遇到了重載,好戲,就發生了。

請看下面代碼:

問題:代碼能正確編譯嗎?

這個題目是一個考察泛型的題目。java里面,泛型實際上是“偽泛型”,并不像C#那樣是實際上的泛型。

IDE會提示我們下面的錯誤:

Method test(List) has the same erasure test(List) as another method in type TR

在java中,泛型只存在于源代碼之中,在編譯過后的代碼中,泛型信息已經被“擦除”了。上面的代碼被編譯之后的樣子應該是下面類似的代碼:

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

在java這種偽泛型中,List和List,**編譯之后,**是相同的類型。

但是在c#這種真實泛型中,上面兩個就是不同的類型了。

故事到這里就結束了嗎??顯然沒有

------------------------------------昏昏咯咯-------------------------------------

看下面代碼:

問,這段代碼能正常編譯嗎?

熟悉class文件結構的人能知道,這段代碼能正常編譯(重載成功了!)。而且還能正常執行呢!!!

代碼輸出:

integer string

疑問來了。jvm規定,函數的返回值并不參與“函數簽名”的生成,那么僅僅改變了函數返回值,從而讓不能編譯的代碼通過了編譯并且能正常執行了,這不是很矛盾嗎?

原因在于,雖然函數的返回值不參與函數簽名的生成,但是在class文件中,只要描述符不完全一致的兩個方法就能共存于一個class文件中。

【java代碼中,函數的特征簽名僅僅包括方法名稱、參數類型以及參數順序。但在字節碼中,特征簽名還包括了方法的返回值以及受查異常表,這就是為什么在class文件中,其他都相同僅僅返回值不同的兩個方法能共存的原因】

總結

以上是生活随笔為你收集整理的当泛型遇到重载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。