1、泛型与原生态类型
声明中具有一个或者多个类型参数的类或者接口,就是泛型类或者接口。每个泛型都定义一个原生态类型,即不带任何实际类型参数的泛型名称。例如,List<E>相对应的原生态类型是List。
2、请不要在新代码中使用原生态类型。虽然不提供类型参数,使用集合类型和其他泛型也仍然是合法的,但是这样就失掉了泛型在安全性(编译时检查)和表述性方面的所有优势。
两个小小的例外,两者都源于“泛型信息可以在运行时被擦除”这一事实。
1)在类文字中必须使用原生态类型,规范不允许使用参数化类型。List.class,String[].class,int.class都是合法的,但是List<String>.class,List<?>.class则不合法。
2)第二个例外与instanceof操作符相关。由于泛型信息可以在运行时被擦除,因此在参数化类型而非无限制通配符上使用instanceof操作符是非法的。用无限制通配符类型代替原生态类型,对instanceof操作符的行为不会产生任何影响。在这种情况下,进括号(<>)和问号(?)就显得多余了。下面是利用泛型来使用instanceof操作符的首选方法:
//Legitimate use of raw type –instanceof operator
If(o instanceof Set){ //Rawtype
Set<?>m = (Set<?>)o; //wildcard type
}
一旦确定这个o是个Set,就必须将它转化成为通配符类型Set<?>,而不是转换成原生态类型Set。这是个受检的转换,因此不会导致编译时警告。
总之,使用原生态类型会在运行时导致异常,因此不要在新代码中使用。