泛型二——原类型(Java tutorial SE7 翻译)
2013-01-22 10:51
344 查看
原类型(Raw Type)是没有提供类型实参的泛型类或接口。例如,下面的Box泛型类:
要创建一个Box<T>的参数化类型,你针对形式化类型参数T,提供了实际类型参数:
如果将实际类型参数删除,你就创建了一Box<T>的原类型:
因此,Box是Box<T>的原类型。然而,非泛型类或接口类型就不是一个原类型。
原类型出现在遗留代码(legacycode)中,因为在JDK5.0前,很多API类(如Java集合框架类)都不是泛型的。当使用原类型时,你将获得泛型前的行为——Box将返回Object类型。为了向后兼容,将参数化类型赋值给原类型是允许的:
如果你将原类型赋给一个参数化类型,你会得到一个警告:
如果你使用原类型来调用定义在泛型类型里的泛型方法,也会产生一个警告:
警告表明,使用原类型会忽略泛型的类型安全性检查,对不安全代码的捕获将推迟的运行时。因此,你应该避免使用原类型。
“类型擦除”一节将提供更多关于Java编译器使用原类型的信息
非受检错误消息
前面提到过,当你将遗留代码和泛型混合在一起时,你会碰到类似于下面的一些警告信息:
当使用老的API来操作原类型时,会发生这样的情况。如下面的例子所示:
这里的术语“非受检(unchecked)”是指编译器没有足够的信息来进行必要的类型检查以保证类型安全。缺省情况下,“非受检”警告是关闭的,但编译器给了一个提示。要察看所有的“非受检”警告,使用-Xlint:unchecked选项重新进行编译。
使用-Xlint:unchecked选项重新编译上面的例子,将显示下面的信息:
要完全屏蔽非受检的警告,使用-Xlint:-unchecked标记。@SuppressWarnings(“unchecked”))注解也会压制非受检警告。如果你不熟悉@SuppressWarnings的语法,请参考“注解”这节内容。
public class Box<T> { public void set(T t) { /* ... */ } // ... } |
要创建一个Box<T>的参数化类型,你针对形式化类型参数T,提供了实际类型参数:
Box<Integer> intBox = new Box<>(); |
如果将实际类型参数删除,你就创建了一Box<T>的原类型:
Box rawBox = new Box(); |
因此,Box是Box<T>的原类型。然而,非泛型类或接口类型就不是一个原类型。
原类型出现在遗留代码(legacycode)中,因为在JDK5.0前,很多API类(如Java集合框架类)都不是泛型的。当使用原类型时,你将获得泛型前的行为——Box将返回Object类型。为了向后兼容,将参数化类型赋值给原类型是允许的:
Box<String> stringBox = new Box<>(); Box rawBox = stringBox; // OK |
如果你将原类型赋给一个参数化类型,你会得到一个警告:
Box rawBox = new Box(); // rawBox is a raw type of Box<T> Box<Integer> intBox = rawBox; // warning: unchecked conversion |
如果你使用原类型来调用定义在泛型类型里的泛型方法,也会产生一个警告:
Box<String> stringBox = new Box<>(); Box rawBox = stringBox; rawBox.set(8); // warning: unchecked invocation to set(T) |
警告表明,使用原类型会忽略泛型的类型安全性检查,对不安全代码的捕获将推迟的运行时。因此,你应该避免使用原类型。
“类型擦除”一节将提供更多关于Java编译器使用原类型的信息
非受检错误消息
前面提到过,当你将遗留代码和泛型混合在一起时,你会碰到类似于下面的一些警告信息:
Note: Example.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
当使用老的API来操作原类型时,会发生这样的情况。如下面的例子所示:
public class WarningDemo { public static void main(String[] args){ Box<Integer> bi; bi = createBox(); } static Box createBox(){ return new Box(); } } |
这里的术语“非受检(unchecked)”是指编译器没有足够的信息来进行必要的类型检查以保证类型安全。缺省情况下,“非受检”警告是关闭的,但编译器给了一个提示。要察看所有的“非受检”警告,使用-Xlint:unchecked选项重新进行编译。
使用-Xlint:unchecked选项重新编译上面的例子,将显示下面的信息:
WarningDemo.java:4: warning: [unchecked] unchecked conversion found : Box required: Box<java.lang.Integer> bi = createBox(); ^ 1 warning |
要完全屏蔽非受检的警告,使用-Xlint:-unchecked标记。@SuppressWarnings(“unchecked”))注解也会压制非受检警告。如果你不熟悉@SuppressWarnings的语法,请参考“注解”这节内容。
相关文章推荐
- java 如何理解泛型类(类型擦除、翻译泛型表达式,翻译泛型方法)
- java中利用反射机制绕开编译器对泛型的类型限制
- java tutorial 翻译 序
- Java | 获取类中所有的泛型对应的class类型
- [转]如何取得java泛型里的类型
- 详解java 中泛型中的类型擦除和桥方法
- java 得泛型真正类型
- Java8中对泛型目标类型推断方法的改进
- Java获取泛型参数的类型的方法 .
- Java 泛型类型的一些限制
- java中泛型之类型通配符(?)
- Java自学之路-Java基础教程-41:Java的强转类型和泛型机制Generic
- java_通过反射获得泛型的实际类型参数
- The Java EE 6 Tutorial 中文版 (翻译) 第32章 JPA简介 (一) 实体
- Java获取泛型参数的类型的方法 - 实例讲解
- Java获取泛型T的类型 T.class
- Java学习笔记-泛型及类型擦除
- java再复习——通过反射获取到方法的参数和返回值的泛型类型
- JAVA的泛型类型和通配泛型