泛型二——原类型(Java tutorial SE7 翻译)
来源:互联网 发布:网易新闻app数据抓取 编辑:程序博客网 时间:2024/04/30 23:21
原类型(Raw Type)是没有提供类型实参的泛型类或接口。例如,下面的Box泛型类:
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 tutorial SE7 翻译)
- 并发——警戒块(Guarded Blocks)(Java tutorial 翻译)
- 并发——死锁活锁(Java se tutorial翻译)
- java SE7 概要图
- JasperReport Tutorial(翻译)-
- Java SE7新特性之泛型实例创建时的类型推断
- Java SE7新特性之泛型实例创建时的类型推断
- JAVA(SE7)作用域规则
- Java SE7新特性之捕获多种类型的异常并且重新抛出使用改进的类型检查的异常
- TreeFrog折腾记(3)——Tutorial翻译(上)
- 【Hadoop】Hive官方文档翻译——Hive Tutorial(上)(Hive 入门指导)
- Django tutorial(1)【翻译】编写第一个Django app,第一部分——创建项目
- opnet14.5 tutorial翻译——包交换网络仿真
- 【Hadoop】Hadoop官方文档翻译——MapReduce Tutorial
- Hadoop官方文档翻译——MapReduce Tutorial
- 并发---不可变对象(java tutorial翻译)
- Rich Client Tutorial Part 1(翻译)
- Theano Tutorial文档翻译(一):词汇
- addslashes函数转义的安全性分析
- c++中关于类型兼容性规则的介绍
- printk 效率好低,能快点不?
- Android开发之EditText属性详解
- 贪心算法之区间选点
- 泛型二——原类型(Java tutorial SE7 翻译)
- MapReduce:详解Shuffle(copy,sort,merge)过程
- ant release
- web.xml中的url-pattern的映射规则
- 100个windows平台C++开发错误之十九Warning
- 计算机通信中的CS和PS
- c语言面试题总结
- tq2440使用RTL8192cu无线网卡(wifi)
- web测试容易被遗漏的地方