《Java 核心技术 卷1》 笔记 第12章 泛型程序设计(3) 翻译泛型表达式+遗留代码警告处理
12.5.1 翻译泛型表达式
返回值为泛型时,相当于获取类型为Object,然后再进行一次强制类型转换
mm.getKey().getTime() 它进行了什么操作呢?
🍨 (1)取出返回值 Pair
🌮 (2)取出 key,类型为 Object
🥗 (3)强制类型转换为 GregorianCalendar
🍟 (4)调用 GregorianCalendar 的 getTime 方法
使用 javap 命令验证:
果然 getKey() 之后进行了类型转换
12.5.2 翻译泛型方法
桥方法:子类形参范围比父类形参范围小
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
import java.io.*;import java.util.*;import java.util.logging.Logger; public class Main { public static void main(String[] args) throws IOException { DataInterval interval = new DataInterval(); interval.setFirst(new Date()); Pair pair = interval; pair.setSecond(new Date()); } } class Pair{ private T first; private T second; protected Logger log = Logger.getGlobal(); public Pair(T first, T second){ this.first = first; this.second = second; } public Pair(){} public T getFirst() { return first; } public void setFirst(T first) { this.first = first; } public T getSecond() { return second; } public void setSecond(T second) { log.info("Pair.setSecond"); this.second = second; }} class DataInterval extends Pair{ @Override public void setSecond(Date second){ log.info("DataInterval.setSecond"); if(second.compareTo(getFirst())>=0){ super.setSecond(second); } }}
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
结果:
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
这个用法是允许的,相当于父类 setSecond(Object second),子类覆盖这个方法,形参范围变为 setSecond(Date date), Date 是 Object 的子类,所以这个用法不会出错。虚拟机会根据需要找到更为合适的方法。
12.5.3 调用遗留代码
测试代码:
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
import javax.swing.*;import java.awt.*;import java.io.*;import java.util.*; public class Main { public static void main(String[] args) throws IOException { Dictionary labelTable = new Hashtable(); labelTable.put(0,new JLabel(new ImageIcon("a.gif"))); labelTable.put(20,new JLabel(new ImageIcon("a.gif"))); JSlider s = new JSlider(); s.setLabelTable(labelTable); Dictionary lt = s.getLabelTable(); } }
❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤
效果如下:
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
我们发现,没有定义泛型的的集合类存放数据,或者将没泛型的数据赋值到有泛型的数据时,会产生警告。实际运行后,确认代码是没问题的,可以用注解@SuppressWarnings("unchecked") 屏蔽警告:
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍
注意:使用 @SuppressWarnings("unchecked") 虽然可以屏蔽警告,但是其他方法中期望有警告的内容也会丢失,建议把需要抑制警告的内容,单独放在一个方法中进行处理。
相关内容:选择 《Java核心技术 卷1》查找相关笔记
评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步
如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!