effective java 读书笔记(五)

本文详细解析了Java泛型与数组的特性差异,强调了在编程实践中优先考虑泛型的重要性,并提供了创建泛型数组的合法但非类型安全的方法,以及在泛型方法使用中的常见警告和解决策略。

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

第二十五条  列表优先于数组

数组与泛型相比有两个重要的不同点:首先,数组是协变的   如果Sub为Super的子类,那么数组类型Sub[]就是Super[]的子类型。而泛型是不可变的,对于任意不同的类型Type1和Type2,泛型List<Type1>既不是List<Type2>的子类型,也不是它的超类型。

其次,数组是具体化的,因此数字会在运行时才知道并检查他们的元素类型约束。泛型则是通过擦除来实现的,因此泛型只是在编译时强化他们的类型信息,并在运行时丢弃他们的元素类型信息。擦除就是是泛型可以与没有使用泛型的代码随意进行互用。因此泛型和数组不能够很好的混用。

创建泛型数组是非法的

数组和泛型有着非常不同的类型规则,数组是协变且可以具体化的,泛型是不可变且可以被擦除的。因此数组提供了运行时的类型安全,但是没有编译时的类型安全;反之,对于泛型也一样。


第二十六条  优先考虑泛型

在自己编写泛型的时候,经常遇到一些警告和错误,例如:

1、你不能创建不可具体化的类型的数组,当你编写用数组支持的泛型时,会出现这个问题。

解决方法:第一种:直接绕过创建泛型数组的禁令,创建一个object的数组,并将它转换成泛型数组,这种方法合法但是不是类型安全的

elements = (E()) new Object[DEFAULT_INITIAL_CAPACITY];

第二种方法:将elements域的类型从E[]改为Object[],通过把从数组中获取的元素由Object转换到E

E result = (E) elements[--size];


第二十七条   优先考虑泛型方法

泛型方法的声明中,声明类型参数的类型参数列表,处在方法的修饰符及其返回类型之间,例如,类型参数为<E>,返回类型为Set<E>

public static <E> Set<E> union( Set<E> s1, Set<E> s2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值