[問題] Recursive type parameter

作者: johnny94 (32767)   2019-02-28 21:43:32
最近在看 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 搞暈了,感覺自己還是沒有搞懂
泛型的用法...
作者: ssccg (23)   2019-03-01 00:07:00
就看extend的那個type裡面哪邊用到T啊如果希望用到T的會變成繼承的物件,就要extend Class<T>類別否則extend Class就相當於extend Class<Object>至於你說回傳型態都變成 Builder那應該是bug看錯,<T extends Builder>的話回傳就會是build沒錯
作者: adrianshum (Alien)   2019-03-01 09:24:00
不傳type param 那款我覺得是不該出現啦。
作者: johnny94 (32767)   2019-03-01 09:52:00
樓上兩位這樣解釋我瞬間懂了…感謝!
作者: pastfox (這個世界沒有神)   2019-06-14 21:48:00
我認識一個蘿莉睡覺時會渾身發抖醒來 因此叫他渾抖蘿

Links booklink

Contact Us: admin [ a t ] ucptt.com