目录
什么是泛型
泛型带来的问题
1、当泛型遇到重载
2、当泛型遇到catch
3、当泛型内包含静态变量
List和原始类型List之间的区别?
List和List之间的区别?
每日寄语
Java泛型( generics) 是JDK 5中引⼊的⼀个新特性, 允许在定义类和接⼜的时候使⽤类型参数( type parameter) 。
声明的类型参数在使⽤时⽤具体的类型来替换。 泛型最主要的应⽤是在JDK 5中的新集合类框架中。
泛型最⼤的好处是可以提⾼代码的复⽤性。 以List接⼜为例,我们可以将String、 Integer等类型放⼊List中, 如不⽤泛型, 存放String类型要写⼀个List接口, 存放Integer要写另外⼀个List接口, 泛型可以很好的解决这个问题。
public class GenericTypes { public static void method(List list) { System.out.println("invoke method(List list)"); } public static void method(List list) { System.out.println("invoke method(List list)"); }
}
上面这段代码,有两个重载的函数,因为他们的参数类型不同,一个是List
另一个是List
,但是,这段代码是编译通不过的。因为我们前面讲过,参数List
和List
编译之后都被擦除了,变成了一样的原生类型List,擦除动作导致这两个方法的特征签名变得一模一样。
如果我们自定义了一个泛型异常类GenericException,那么,不要尝试用多个catch取匹配不同的异常类型,例如你想要分别捕获GenericException、GenericException,这也是有问题的。
public class StaticTest{public static void main(String[] args){GT gti = new GT();gti.var=1;GT gts = new GT();gts.var=2;System.out.println(gti.var);}
}
class GT{public static int var=0;public void nothing(T x){}
}
答案是——2!
由于经过类型擦除,所有的泛型类实例都关联到同一份字节码上,泛型类的所有静态变量是共享的。
原始类型List和带参数类型List
之间的主要区别是,在编译时编译器不会对原始类型进行类型安全检查,却会对带参数的类型进行检查。通过使用Object作为类型,可以告知编译器该方法可以接受任何类型的对象,比如String或Integer。它们之间的第二点区别是,你可以把任何带参数的类型传递给原始类型List,但却不能把List
传递给接受 List
的方法,因为会产生编译错误。
List>
是一个未知类型的List,而List
其实是任意类型的List。你可以把List
, List
赋值给List>
,却不能把List
赋值给 List
。
莫等闲,白了少年头,空悲切!——岳飞