泛型的理解

--.泛型是编译器层面上的而不是虚拟机上的,虚拟机上不存在泛型.

x.可以使用泛型的有 类,接口和方法.泛型方法可以直接定义在普通类中

方法的如下:

public <T> T getT(T t);

public static <T extends Abc> T getT(T t);
<T> 是必须存在的,可以限定返回值和参数T

 

x.泛型在jvm 中执行的时候,也就是说参数类型被擦除时,是使用类型参数的上边界来确定的,即最父类.如 List<T>(List<String> 是List<T>的一个实例类型,在jvm 中也是Object) 那么T 在jvm 中就是Object 对象.如果是 List<T extends String> 那么 T 在jvm 中就是String.

 

---.泛型的转换

1.强制类型转换.

2.用桥方法保证继承的多态. 

参考:

<核心1> 12.5.1 节 p535

http://jiangshuiy.iteye.com/blog/1339105

 

0. 泛型的类型参数不能用在Java异常处理的catch语句中。因为异常处理是由JVM在运行时刻来进行的。由于类型信息被擦除,JVM是无法区分两个异常类型MyException<String>;MyException<Integer>的。对于JVM来说,它们都是 MyException类型的。也就无法执行与异常对应的catch语句。

 

1.?通配符所代表的其实是一组类型,但具体的类型是未知的。List<?>所声明的就是所有类型都是可以的。但是List<?>并不等同于List<Object>List<Object>实际上确定了List中包含的是Object及其子类,在使用的时候都可以通过Object来进行引用。而List<?>则其中所包含的元素类型是不确定。其中可能包含的是String,也可能是Integer。如果它包含了String的话,往里面添加Integer类型的元素就是错误的。正因为类型未知,就不能通过new ArrayList<?>()的方法来创建一个新的ArrayList对象。因为编译器无法知道具体的类型是什么。但是对于 List<?>中的元素确总是可以用Object来引用的,因为虽然类型未知,但肯定是Object及其子类。

 

posted @ 2015-11-09 14:08  predisw  阅读(140)  评论(0编辑  收藏  举报