Effective Java 第 23 条: 请不要在新代码中使用原生态类型

从jdk1.5版本开始,java就引入了泛型。在没有泛型之前,从集合中取出的对象都必须经过转型,才能够达到使用。在jdk1.5之前,如果往集合中插入了不同类型的对象的话,那么在遍历的时候就可能引起运行时转型失败。

泛型定义:A class or interface whose declaration has one or more type parameters is a generic class or interface [JLS, 8.1.2, 9.1.2].就是说一个类或者接口拥有一或者多种类型参数的声明就是泛型类或者接口。

以下代码会编译出错:

public class Test1 {

   public static void main(String[] args) {

      List<String> strings = new ArrayList<String>();

      unsafeAdd(strings, new String("42"));

      String s = strings.get(0); // Compiler

   }

 

   static void unsafeAdd(List<String> list, Object o) {

      list.add(o);

   }

}//The method add(String) in the type List<String> is not applicable for the arguments (Object)

当不知道具体类型的时候,可以使用“?”号来表示通用的参数类型,如:

static int numElementsInCommon(Set<?> s1, Set<?> s2){

...}

总之,如果使用jdk1.5版本的话,那么就使用泛型。Set<Object>表示一个参数化类型,并且该Set里面只能够放Object类型的元素;Set<?>是一个通配符,表示Set中仅仅包含了一些未知类型的对象;Set是一个原生类型,没有指定泛型。前两者都是安全的,但是后者不是安全的。

Effective Java 第 23 条: 请不要在新代码中使用原生态类型_第1张图片

你可能感兴趣的:(Effective Java 第 23 条: 请不要在新代码中使用原生态类型)