[問題] Recursive type parameter

看板java作者 (32767)時間5年前 (2019/02/28 21:43), 編輯推噓1(107)
留言8則, 3人參與, 5年前最新討論串1/1
最近在看 Effective Java,但是裡面有一些泛型的地方不太了解,想請教一下各位 先來個我懂的: static <T extends Comparable<T>> T max(T[]) { ... } static <T extends Comparable> T max(T[]) { ... } 第一種跟第二種的差別應該是,第一種宣告確保只能跟 T 類的物件比較, 第二種的話就是可以跟任何物件比較,不限定是 T。 而在 Effective Java Item 2 裡介紹的 Builder 中,書上這樣子宣告類別: abstract static class Builder<T extends Builder<T>> { public T addTopping(Topping topping) { ... } public abstract T self(); } 我想問一下這邊使用 <T extends Builder<T>> 或 <T extends Builder> 的差別是什麼呢? 我自己用 IntelliJ 看的時候,如果宣告成 <T extends Builder<T>> addTopping 跟 self 的回傳型態都是 T 若是宣告成 <T extends Builder> 的話回傳型態都變成 Builder 實在是被這種 recursive type parameter 搞暈了,感覺自己還是沒有搞懂 泛型的用法... --

06/14 21:48,
我認識一個蘿莉睡覺時會渾身發抖醒來 因此叫他渾抖蘿
06/14 21:48
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 153.150.177.211 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1551361417.A.2B5.html

03/01 00:07, 5年前 , 1F
就看extend的那個type裡面哪邊用到T啊
03/01 00:07, 1F

03/01 00:07, 5年前 , 2F
如果希望用到T的會變成繼承的物件,就要extend Class<T>
03/01 00:07, 2F

03/01 00:08, 5年前 , 3F
類別
03/01 00:08, 3F

03/01 00:08, 5年前 , 4F
否則extend Class就相當於extend Class<Object>
03/01 00:08, 4F

03/01 00:09, 5年前 , 5F
至於你說回傳型態都變成 Builder那應該是bug
03/01 00:09, 5F

03/01 00:11, 5年前 , 6F
看錯,<T extends Builder>的話回傳就會是build沒錯
03/01 00:11, 6F

03/01 09:24, 5年前 , 7F
不傳type param 那款我覺得是不該出現啦。
03/01 09:24, 7F

03/01 09:52, 5年前 , 8F
樓上兩位這樣解釋我瞬間懂了…感謝!
03/01 09:52, 8F
文章代碼(AID): #1ST-M9Ar (java)