题外话:终于到了泛型这一章,这一章真是看的我头皮发麻,神志不清。很多自己得出的结论在几页之后就完全推翻了。这里写的总结不一定对,很多只是看了别人的博客以及自己推测的结果,而且文中会有部分东西连我自己也没理清楚。看到一半我就去打游戏了,真的废。
将一组对象直接打包存储于其中一个单一对象,这样的对象叫做元组。允许读取其中元素,不允许存放新的对象。元组可以具有任意长度,且其中的对象可以是任意不同的类型。
在排序中,末端哨兵内容为空。
对于泛型,基本类型无法作为参数。应该尽可能运用泛型方法。
对于一个static方法,无法访问泛型类的参数。
泛型方法中的泛型参数列表在返回值之前。
类型推断只对赋值操作有效,其他的无效。如果将一泛型方法调用结果作为参数传递给另一方法,这时不会执行类型推断。因为编译器认为调用泛型方法后,其返回值被赋值给了一个Object类的变量。
利用生成器生成对象,则该类必须具有默认构造器,并且是public的
在泛型代码内部无法获得任何有关泛型参数类型的信息。
List<String>和List<Integer>在运行时是相同的类型,他们都被擦除为“原生”类型List。
泛型类型参数将擦除到它的第一边界。具体为:普通类到Object类;子类到父类。
在擦除实现中,泛型类型被当作第二类型处理。即不能在某些重要的上下文环境使用的类型。
泛型的代价:泛型不能显示的引用运行时类型的操作之中。如转型,instanceof以及new等操作。
在泛型中创建数组,推荐使用Array.newInstance()。即使编译器不知道泛型类中有关方法关于泛型参数的任何信息,但它仍可在编译器确保放置到结果的对象具有泛型参数类型。
擦除在方法体中移除了类型信息,所以在运行时的问题就是边界:即对象进入和离开方法的地点。这些是编译器在编译期执行类型检查并插入转型代码的地点。
泛型的动作都发生在边界处——对传递进来的值进行额外的编译期检查,并插入对传递出去的值的转型。
任何在运行时需要知道确切类型信息的操作都无法工作。
有时通过引入类型标签(显示传递类型的Class对象,Class<T> obj)对擦除进行补偿,擦除的是类型信息。
成功创建泛型数组的唯一方式是创建一个被擦除类型的新数组,然后对其转型。
编译期:将代码转成机器码,相当于翻译语法; 运行期:跑代码
泛型实参只会在类、字段以及方法参数内保存签名。无法通过反射动态获取泛型实例的具体实参。
获取泛型实参的3种方法:
1、传递实参类型; 2、明确定义泛型实参类型,通过反射获取签名; 3、通过匿名类。