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的静态成员,于是就可以得出这样的结论,所有泛化类型的静态成员被其所有的实例化对象共享,因此也就要求所有静态成员不能够是泛化的!
2、 过载(overload)冲突问题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
}
函数过载的定义这样的:在一个类的范围内,如果两个函数具有相同的函数名称,不同的参数(返回值不考虑)就互相称为过载函数。看一个例子:
3、 接口实现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)...{} //没有问题,编译器不会报错!
}
一个类不能同时实现具有相同擦除效果的接口,例如:
class Foo implements Comparable<Integer>, Comparable<Long>
Comparable<Integer>, Comparable<Long>都被擦除成Comparable。
0
相关文章
