脚本宝典收集整理的这篇文章主要介绍了java类型擦除(java type erasure mechanism),脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
在JDK5之后java提供了泛型(Java Genertics),允许在定义类的时候使用类型作为参数。泛型广泛应用于各类集合中。本文对其以及其用法进行介绍。
1. 一个常见的错误
public class Main { public static void main(String[] args) throws IOException { ArrayList<String> al = new ArrayList<String>(); al.add("a"); al.add("b"); accept(al); } public static void accept(ArrayList<Object> al){ for(Object o: al) System.out.println(o); } }
似乎Object是String的父类,并没有问题。但是,编译时候是不能通过的。报错如下:
The method accept(ArrayList < Object > ) in the type Main is not applicable for the arguments (ArrayList < String > )
2. List<Object> vs List<String>
原因是java类型擦除机制,在编译成class文件时候,编译器并未把Object和String类型信息编译进去。因此为了防止错误,编译器在编译时候发现他们不一致就会报错。
3. 通配符和无界通配符
(1) 无界通配符
List<?> 可接收任何类型。
public static void main(String args[]) { ArrayList<Object> al = new ArrayList<Object>(); al.add("abc"); test(al); } public static void test(ArrayList<?> al){ for(Object e: al){//no matter what type, it will be Object System.out.println(e); // in this method, because we don't know what type ? is, we can not add anything to al. } }
(2)通配符
List< Object > - List can contain Object or it's subtype List< ? extends Number > - List can contain Number or its subtypes. List< ? super Number > - List can contain Number or its supertypes.
转自我的博客园(http://www.cnblogs.com/qins/p...
以上是脚本宝典为你收集整理的java类型擦除(java type erasure mechanism)全部内容,希望文章能够帮你解决java类型擦除(java type erasure mechanism)所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。