1 无限定通配符 <?>
Generic
而如果就是希望 printMsg 方法既能接收Generic
2 上限通配符 <? extends Number>
为泛型添加上边界,即传入的类型实参必须是指定类型或指定类型的子类。使用extends指定上限通配符
因为Generic<? extends Number> generic指定了传入的类型实参必须是 Number 类或 Number 类的子类,所以printMsg(genericString);出错,因为 String 不是 Number 的子类
3 下限通配符 <? supper Integer>
和上限通配符类似,下限通配符使用super关键字实现
因为Generic<? super Integer> generic指定了传入的类型实参必须是 Integer 类或 Integer 类的父类,所以printMsg(genericFloat);和printMsg(genericString);出现编译错误,因为 Float 和 String 都不是 Integer 类的父类
2类型擦除
Java 的泛型只在编译阶段有效,编译过程中正确检验泛型结果后,会将泛型相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法,即泛型信息不回进入运行时阶段:
结果返回true,说明虽然编译时Generic