effective java 读书笔记(五)

来源:互联网 发布:大数据龙头股 编辑:程序博客网 时间:2024/04/24 20:34

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

数组与泛型相比有两个重要的不同点:首先,数组是协变的   如果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)

0 0
原创粉丝点击