技术开发 频道

JAVA泛型浅析


IT168技术文档】 
    擦除所带来的问题: 
    1、 静态成员共享问题 
        List<Integer> ints = Arrays.asList(1,2,3); 
        List<String> strings = Arrays.asList("one","two"); 
        assert ints.getClass() == strings.getClass(); 
    ints和strings两个对象最终被擦除成具有相同类型的(List)的对象,于是这两个对象共享List的静态成员,于是就可以得出这样的结论,所有泛化类型的静态成员被其所有的实例化对象共享,因此也就要求所有静态成员不能够是泛化的!
class Foo<T> { private final T value; private static List<T> values = new ArrayList<T>(); //非法 public T getValue() { return value; } public static List<Object> values = new ArrayList<Object>() // ok }
    2、 过载(overload)冲突问题 
    函数过载的定义这样的:在一个类的范围内,如果两个函数具有相同的函数名称,不同的参数(返回值不考虑)就互相称为过载函数。看一个例子:
Class A{ Public int foo(int a){}; Public int foo(float f){}; // 是过载,编译没有问题 Public int foo(int a){}; Public float foo(int f){}; // 报错 Public static int foo1(List<Integer> a){} Public static int foo1(List<String> s){} //编译有错误,
//因为所有的List<T>都被擦除成List,这样两个函数重复定义,报错;
Public static int foo1(List<Integer> a){} Public static String foo1(List<String> s){} //没有问题,编译器不会报错! }
    3、 接口实现 
    一个类不能同时实现具有相同擦除效果的接口,例如:
class Foo implements Comparable<Integer>, Comparable<Long>
Comparable<Integer>, Comparable<Long>都被擦除成Comparable。
0
相关文章