[问题] 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