2019-10-13:1_5_6

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,这正是泛型应该避免的情况.

    }

你可能感兴趣的:(2019-10-13:1_5_6)