public class p1_5_6
{
public static void main(String[] args)
{
/**
* 类型擦除
*
* 泛型很大程度上是Java语言中的成分而不是虚拟机中的结构.
* 泛型可以由编译器用过类型擦除(type erasure)过程转为非泛型类,
* 这样,编译器就生成一种与泛型类同名的原始类(raw class),但类型参数都被删除.
* 类型变量由它们的类型限界代替,当一个具有擦除返回类型的泛型方法被调用的时候,一些特性被自动插入.
* 如果使用一个泛型类不带类型参数,那么使用的是原始类.
*/
/**
* 泛型限制:
*/
//1.基本类型不能用作类型参数.
//2.instanceof检测:instanceof检测和类型转换工作只对原始类型进行.
GenericMemoryCell cell1=new GenericMemoryCell<>();
cell1.write(4);
Object cell=cell1;
GenericMemoryCell cell2= (GenericMemoryCell) cell;
// String s=cell2.read();//ClassCastException
/**
* 3.static语境:
*
* 在一个泛型类中,static方法和static域均是不可引用类的类型变量.
* 因为在类型擦除后类型变量就不存在了.另外,由于实际上只存在一个原始的类,
* 因此static域在该类的诸多泛型实例之间是共享的.
*/
/**
* 4.泛型类型实例化:
*/
// T obj=new T();//非法.T由它限界代替,可能是Object也可能是抽象类,因此new无意义.
/**
* 泛型数组对象
*
* T将由它的限界代替,这很可能是Object T,于是(由类型擦除产生的)对T[]的类型转换将无法进行,因为Object[] IS-N-A T[].
* 由于不能创建泛型对象的数组,因此必须创建一个擦除类型的数组,然后使用类型转换.这种类型转换将产生一个关于
* 未检验的类型转换编译警告.
*/
// T[] ts=new T[];//非法.
/**
* 参数化类型的数组
*/
//参数化类型的数组的实例化是非法的,考虑以下代码:
GenericMemoryCell[] cs=new GenericMemoryCell[10];
GenericMemoryCell c=new GenericMemoryCell<>();
c.write(4.5);
Object[] os=cs;
os[0]=c;
// String str=cs[0].read();//ClassCastException,这正是泛型应该避免的情况.
}