java 板


LINE

※ 引述《LaPass (LaPass)》之铭言: : //下面这段OK : List<A> lista; : List<C> listc=new ArrayList<>(); : listc.add(new C()); : //lista = listc; // X : lista=(List)listc; //OK : A a=lista.get(0); //OK : System.out.print(a.getStr()); //印出 C 你可以了解一下「共变性」… Java的泛型并不具有共变性,不过可以使用型态通配字元?与extends来宣告变数,使其达 到类似共变性。 http://openhome.cc/Gossip/Java/Generics-extends.html 如果需要达到类似共变性的功能,可以用 ? extends,这样就不用 CAST 来关掉编译器 型态检查功能 … List<? extends A> lista; List<C> listc = new ArrayList<>(); listc.add(new C()); lista = listc; // OK,类似共变性 A a=lista.get(0); //OK System.out.print(a.getStr()); //印出 C : //让我们反过来试试看,这样也是ok的 : List<A> lista=new ArrayList<>(); : List<C> listc; : lista.add(new C()); //OK 自动转型 : //listc = lista; // X : listc=(List)lista; //OK : A a=listc.get(0); //OK : System.out.print(a.getStr()); //印出C 可以研究一下「逆变性」,如果Node<A>视为一种Node<B>,则称Node具有 逆变性(Contravariance)。Java泛型并不支援逆变性,可以使用型态通配字元? 与super来宣告,以达到类似逆变性的效果 http://openhome.cc/Gossip/Java/Generics-super.html 如果需要达到类似逆变性的功能,可以用 ? super,这样就不用 CAST 来关掉编译器 型态检查功能 … List<A> lista=new ArrayList<>(); List<? super C> listc; Lista.add(new C()); //OK 这不是自动转型,这是符合 is-a 关系 listc = lista; // OK,类似逆变性 A a= (A) listc.get(0); // 确定没问题,关掉编译器型态检查 System.out.print(a.getStr()); //印出C : //编译OK但是执行不OK : List<A> lista=new ArrayList<>(); : List<C> listc; : lista.add(new A()); //OK 自动转型 : //listc = lista; // X : listc=(List)lista; //OK : C c=listc.get(0); //编译OK,执行错误 : ClassCastException: A cannot be cast to C 因为 CAST 实际上是关掉编译器型态检查的功能,实际上 listc 参考的实例, 当中是维护了一串 A 实例,你又编译时期叫编译器住嘴,当然执行时期出错就得 自行收拾了 … XD : //再来看一个更惊悚的 : List<A> lista=new ArrayList<>(); : List<B> listb; : listb=(List)lista; //OK : listb.add(new B()); //OK.... 慢着,这很明显有问题啊! : B b=listb.get(0); //可是还是被我拿出来了 : A a=lista.get(0); //编译ok,执行时才出错 : ClassCastException: B cannot be cast to A 这不是惊不惊悚的问题,CAST 是关掉编译器型态检查功能,在不确定内容物究竟为何 ,就进行 cast(或者是故意 cast),想不出错很难吧! … XD 简单来说,只有在确实清楚实例的型态为何下,再进行 CAST(也就是要编译器别罗嗦) …XD : 因为java在运行时根本不会记住那个物件的泛型型别 是的,泛型提供的资讯只是给编译器看的 ... -- 良葛格学习笔记 http://openhome.cc --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 49.215.51.149
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1432807635.A.264.html ※ 编辑: JustinHere (49.215.51.149), 05/28/2015 18:10:27







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灯, 水草

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

TOP