--.泛型是编译器层面上的而不是虚拟机上的,虚拟机上不存在泛型.
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
及其子类。