java 板


LINE

※ 引述《jtorngl (DDFL)》之铭言: : 请问 Collection 不支援 covariance (还是该说泛型不支援 covariance) : 所以 summary 只能传入 List<Number> 的物件 : 而不能传入 List<Integer>、List<Double>, ... : public double summary(List<Number> nums) { 你只能传 List<Number>,不能传 List<Integer> 等… : 为了让这段程式能达到类似 covariance 机制 : 所以会使用 wildcard : public double wildcardSummary(List<? extends Number> nums) { 你可以传 List<Number>、List<Integer> 等… : 不过泛型使用 extends 一样可以做到不是吗 : private <E extends Number> double genericsSummary(List<E> nums) { 你必须先确定 E 真正的型态,而这个 E 只能是 Number 的子类,一旦 E 确认了 ,例如 Number,那麽你就只能传 List<Number>… 是的,这也可以解决 List<? extends Number> 能解决的问题,不过语法意义上 是不同的,只不过两者正好涵盖了相同的问题。 因为正好能解决相同问题,就简洁度来说, List<? extends Number> 会是我想 要的写法,因为只要出现一次角括号… 另一方面,若是个 instance method,通常会以类别上的型态限定为主,例如: public class Test<E> { public E foo(List<? extends Number> nums) { return null; } } 会在方法前使用型态限定,通常是在 static method 时,例如: public class Test { public static <E extends Number> Some foo(E e) { return null; } } : 目前能想到的只有,wildcard 有 super 来达到 contravariance : 但是泛型只支援 extends 而没有支援 super : 那如果没有要 contravariance 的效果 : 有什麽情况是 wildcard 才能做到,而泛型还是不能编译的? 不要从能不能编译来看,很多情况其实都可以通过编译,你要看你想解决什麽 ,以及可读性哪个比较好。 : 目前看一些文章,在方法的参数,要限制参数型态边界时 : 几乎都是使用 List<? extends Number> : 好像比较少看到 <E extends Number> ... List<E> : 看了一下 JDK 的 List interface : boolean addAll(Collection<? extends E> c); : 是因为限制的参数型态都是动态,才只能用 wildcard 吗? 不是,理由上面说过,你想看到更多 <E extends Number> 的应用,可以找找 有 static method 的类别,例如 Collections.. static <T extends Object & Comparable<? super T>> T maxCollection<? extends T> coll) static <T extends Comparable<? super T>> void sortList<T> list) : 以JDK 的 List 介面来说 : public interface List<E> extends Collection<E> : 有一个方法是 boolean containsAll(Collection<?> c); : : 如果是这样定义的 : boolean containsAll(Collection<E> c); : : 那当我们建立 List<String> strs = Arrays.asList("1", "2"); : 那这个 strs 的 containsAll 方法,只能用来比较 String 集合了 : : 反之因为使用 ? 定义 : boolean containsAll(Collection<?> c); 这样定义 : 所以 strs 还是可以用来比对各种型态的集合 这就是两者应用上的差别之一…instance method 通常会以类别上宣告的型态来限定, 因为阅读上比较简单。 也可以进一步看看这边的文件: https://openhome.cc/Gossip/JavaEssence/WildCard.html -- 良葛格学习笔记 http://openhome.cc --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 39.10.69.16 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1598789899.A.696.html ※ 编辑: JustinHere (39.10.69.16 台湾), 08/30/2020 20:24:35 ※ 编辑: JustinHere (39.10.69.16 台湾), 08/30/2020 20:25:04
1F:推 qrtt1: 是良葛格! 08/30 21:42
2F:推 jtorngl: 感谢良葛格的说明,Java SE8 技术手册有买,不过第18章没 08/31 12:58
3F:→ jtorngl: 翻XD,学习笔记的静态方法泛型倒是有看不懂的地方,就是 08/31 12:59
从 Java SE 9 技术手册开始,我有把 Producer Extends,Producer Extends 的说明加 进去,这也是个理解的方向。
4F:→ jtorngl: BeanUtil.<Student>getBean(...) 的用法,在方法名称前面 08/31 13:00
5F:→ jtorngl: 加上 <型别> 只是为了链呼叫,不加会编译错误 08/31 13:00
因为单纯做 method chain,没有变数型态可以参数,就得明确指定泛型的型态: BeanUtil.<Student>getBean( data, "cc.openhome.Student").getName(); 若有变数型态可参考就不用,因为编译器可以从变数的型态来推断,例如文件中 就有个例子: Student student = BeanUtil.getBean(data, "cc.openhome.Student"); ※ 编辑: JustinHere (110.26.97.16 台湾), 08/31/2020 17:42:52
6F:推 jtorngl: public static <T> T obtain(T t) { return t; } 08/31 18:25
7F:→ jtorngl: 我有试着练习一个泛型方法 08/31 18:25
8F:→ jtorngl: GenericMethod.staticObtain("abc").toUpperCase(); 08/31 18:26
9F:→ jtorngl: GenericMethod.<String>obtain("abc").toUpperCase(); 08/31 18:26
10F:→ jtorngl: 发现没加 <String> 还是可以编译和执行,所以有点搞不懂 08/31 18:27
因为你的 obtain 是: public static <T> T obtain(T t) { return t; } T 用在参数上,之後的呼叫中,"abc" 已经告诉编译器,T 的型态是 String 了… 至於文件上的 static method 是: public static <T> T getBean(Map<String, Object> data, String clzName) 之後的呼叫中,没有任何来源可以告诉编译器,T 的型态是什麽,你就得主动提供…
11F:→ jtorngl: JDK java-11-openjdk-11.0.8.10-2.windows.redhat.x86_64 08/31 18:29
12F:→ jtorngl: 没加<String> 不是打错,是推文长度不够,改名忘了改到 08/31 18:30
13F:推 jtorngl: 我练习是 staticObtain(),推文长度不足才改 obtain() 08/31 18:32
14F:推 tw11509: java 8之後大部分的情况就不用加了,编译器会自己推断出 08/31 20:08
15F:→ tw11509: 来 08/31 20:08
编译时期型态推断是一直在加强,不用一直纠结在这部份,必须得提供时就提供,只要 你不是不明就理地直接 cast 就行。 ※ 编辑: JustinHere (27.247.130.217 台湾), 09/01/2020 07:53:47
16F:推 jtorngl: 感谢良葛格说明,原来是方法的参数没有型态让编译知道 09/01 11:18
17F:→ jtorngl: static <T> T jsonToObj(String json, Class<T> clazz) 09/01 11:19
18F:→ jtorngl: 我使用的方法都会在方法参数带<T>,所以不知道那种用法 09/01 11:19
19F:→ jtorngl: 这种型态推断蛮强大的,但就和初学lambda一样,对语法 09/01 11:21
20F:→ jtorngl: 不熟悉时,会觉得为什麽可以这样啊?! 09/01 11:21







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Tech_Job站内搜寻

TOP