9.2.3 并不存在泛型类

9.2.3 并不存在泛型类

前面提到可以把ArrayList<String>类当成ArrayList的子类,事实上, ArrayList<String>类也确实像种特殊的ArrayList类:该Arraylists<String>对象只能添加String对象作为集合元素。但实际上,系统并没有为ArrayList<String>生成新的class文件,而且也不会把ArrayList<String>当成新类来处理。

看下面代码的打印结果是什么?

1
2
3
4
5
//分别创建List<String>对象和List<Integer>对象
List<string> list1=new ArrayList<>();
List<Integer> list2 =new ArrayList<>();
//调用getClass()方法来比较list1和list2的类是否相等
System.out.printin(list1.getClass()==list2.getClass());

运行上面的代码片段,可能有读者认为应该输出false,但实际输出true。因为不管泛型的实际类型参数是什么,它们在运行时总有同样的类(class)。

静态方法 静态初始化块 静态变量的声明和初始化中不允许使用泛型形参

不管为泛型形参传入哪一种类型实参,对于Java来说,它们依然被当成同一个类处理,在内存中也只占用一块内存空间,因此在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用泛型形参。下面程序演示了这种错误。

1
2
3
4
5
6
7
8
9
10
public class R<T> {
// 下面代码错误,不能在静态变量声明中使用泛型形参
static T info;
// T age;

public void foo(T msg) {
}
// 下面代码错误,不能在静态方法声明中使用泛型形参
// public static void bar(T msg){}
}
1
Cannot make a static reference to the non-static type TJava(536871434)