作者johnny94 (32767)
看板java
标题[问题] Recursive type parameter
时间Thu Feb 28 21:43:32 2019
最近在看 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 搞晕了,感觉自己还是没有搞懂
泛型的用法...
--
1F:→ pastfox:我认识一个萝莉睡觉时会浑身发抖醒来 因此叫他浑抖萝 06/14 21:48
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 153.150.177.211
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1551361417.A.2B5.html
2F:→ ssccg: 就看extend的那个type里面哪边用到T啊 03/01 00:07
3F:→ ssccg: 如果希望用到T的会变成继承的物件,就要extend Class<T> 03/01 00:07
4F:→ ssccg: 类别 03/01 00:08
5F:→ ssccg: 否则extend Class就相当於extend Class<Object> 03/01 00:08
6F:→ ssccg: 至於你说回传型态都变成 Builder那应该是bug 03/01 00:09
7F:→ ssccg: 看错,<T extends Builder>的话回传就会是build没错 03/01 00:11
8F:推 adrianshum: 不传type param 那款我觉得是不该出现啦。 03/01 09:24
9F:→ johnny94: 楼上两位这样解释我瞬间懂了…感谢! 03/01 09:52