技术开发 频道

JAVA泛型浅析


IT168技术文档】 
    擦除的原则: 
    1、 所有参数化容器类都被擦除成非参数化的(raw type);如List<E>、List<List<E>>都被擦除成List; 
    2、 所有参数化数组都被擦除成非参数化的数组;如List<E>[],被擦除成List[]; 
    3、 Raw type的容器类,被擦除成其自身,如List 被擦除成List; 
    4、 原生类型(int,String还有wrapper类)都擦除成他们的自身; 
    5、 参数类型E,被擦除成Object; 
    6、 所有约束参数如<? Extends E>、<X extends E>都被擦除成E; 
    7、 如果有多个约束,擦除成第一个,如<T extends Object & E>,则擦除成Object; 
    例如: 
    泛化代码:
List<String> words = new ArrayList<String>(); words.add("Hello "); words.add("world!"); String s = words.get(0)+words.get(1);
    擦除后就变成了:
List words = new ArrayList(); words.add("Hello "); words.add("world!"); String s = ((String)words.get(0))+((String)words.get(1))
    擦除后的代码和以前没有泛型时候写的代码没有任何区别! 
    再例如: 
    泛化代码:
public class textReader<T>{ private T a; public textReader(T b){ this.a = b; } public T getA(){ return a; } public static void main(String[] agrvs){ String in = "1234567890"; textReader<String> test = new textReader<String>(in); String out = test.getA(); System.out.println(out); } }
    擦除后(所有类型参数都被去掉,T被擦除成Object)就变成(注意红色部分):
public class textReader{ private Object a; public textReader(Object b){ this.a = b; } public Object getA(){ return a; } public static void main(String[] agrvs){ String in = "1234567890"; textReader test = new textReader (in); String out = (String)test.getA(); System.out.println(out); } }
0
相关文章