当前位置: 代码迷 >> J2SE >> 泛型类,该怎么解决
  详细解决方案

泛型类,该怎么解决

热度:109   发布时间:2016-04-23 19:49:16.0
泛型类
最近在看《疯狂java讲义》,里面说ArrayList<String>不是ArrayList的子类。
不管为泛型的类型参数传入哪一种类型实参,对于java来说,它们依然被当做同一个类来处理,在内存中也只占用一块内存空间,因此在静态方法,静态初始化块或者静态变量的声明和初始化中不允许使用类型实参。下面的程序错误:
public class R<T>
{
   static T info;
    
    public  static void bar(T msg){}
}

为什么:在静态方法,静态初始化块或者静态变量的声明和初始化中不允许使用类型实参??????

求大神指点迷津
------解决思路----------------------
举例,就是说R(ArrayList)和R(LinkedList)是同一种类(虽然好好像不能这么理解) ,他们是共享static字段的,如果该字段使用了泛型,不能保证同时是ArrayList和LikedList。

另外从对象初始化的机制和泛型实现方式来说也可以,这个就比较复杂点,手机码字就不说了,> 《thinking in java》有详细的解释
------解决思路----------------------
1. ArrayList<String>继承ArrayList了吗?显然没有,那你怎么能说前者是后者的子类呢。而且,类型擦出后,压根儿就没有ArrayList<String>,擦除直接把它变成了ArrayList
2. 静态方法是允许使用类型参数的,不过都要加上<T>。如
	
public static <T> void test(T a){}
public static <T> void test(){}

明确调用为 类.<具体类型>test()
3.静态初始化块或者静态变量的声明和初始化中的确不允许使用类型参数。因为类型参数,没有new对象压根儿不知道具体类型是啥,无法通过类直接调用。那为什么静态方法可以呢。因为返回类型前面指定了<T>,这个和定义类R的<T>不同
  相关解决方案