再读thinking in java -- 第十五章 泛型(一)

本文深入探讨了泛型编程的概念及其实现细节,包括元组、泛型方法的使用原则、类型推断限制、泛型数组的创建方法以及泛型在运行时的行为特性等。文章还特别强调了泛型在不同上下文中的应用技巧与限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题外话:终于到了泛型这一章,这一章真是看的我头皮发麻,神志不清。很多自己得出的结论在几页之后就完全推翻了。这里写的总结不一定对,很多只是看了别人的博客以及自己推测的结果,而且文中会有部分东西连我自己也没理清楚。看到一半我就去打游戏了,真的废。


将一组对象直接打包存储于其中一个单一对象,这样的对象叫做元组。允许读取其中元素,不允许存放新的对象。元组可以具有任意长度,且其中的对象可以是任意不同的类型。

在排序中,末端哨兵内容为空。

对于泛型,基本类型无法作为参数。应该尽可能运用泛型方法。

对于一个static方法,无法访问泛型类的参数。

泛型方法中的泛型参数列表在返回值之前。

类型推断只对赋值操作有效,其他的无效。如果将一泛型方法调用结果作为参数传递给另一方法,这时不会执行类型推断。因为编译器认为调用泛型方法后,其返回值被赋值给了一个Object类的变量。

利用生成器生成对象,则该类必须具有默认构造器,并且是public的

在泛型代码内部无法获得任何有关泛型参数类型的信息。

List<String>和List<Integer>在运行时是相同的类型,他们都被擦除为“原生”类型List。

泛型类型参数将擦除到它的第一边界。具体为:普通类到Object类;子类到父类。

在擦除实现中,泛型类型被当作第二类型处理。即不能在某些重要的上下文环境使用的类型。

泛型的代价:泛型不能显示的引用运行时类型的操作之中。如转型,instanceof以及new等操作。


在泛型中创建数组,推荐使用Array.newInstance()。即使编译器不知道泛型类中有关方法关于泛型参数的任何信息,但它仍可在编译器确保放置到结果的对象具有泛型参数类型。

擦除在方法体中移除了类型信息,所以在运行时的问题就是边界:即对象进入和离开方法的地点。这些是编译器在编译期执行类型检查并插入转型代码的地点。

泛型的动作都发生在边界处——对传递进来的值进行额外的编译期检查,并插入对传递出去的值的转型。

任何在运行时需要知道确切类型信息的操作都无法工作。

有时通过引入类型标签(显示传递类型的Class对象,Class<T> obj)对擦除进行补偿,擦除的是类型信息。

成功创建泛型数组的唯一方式是创建一个被擦除类型的新数组,然后对其转型。

编译期:将代码转成机器码,相当于翻译语法;    运行期:跑代码

泛型实参只会在类、字段以及方法参数内保存签名。无法通过反射动态获取泛型实例的具体实参。

获取泛型实参的3种方法:

1、传递实参类型;    2、明确定义泛型实参类型,通过反射获取签名;    3、通过匿名类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值