泛型二——原类型(Java tutorial SE7 翻译)

本文探讨了Java中的原类型概念及其使用时可能遇到的非受检警告问题,解释了如何处理这些警告,并提供了相关的代码示例。

原类型(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的语法,请参考“注解”这节内容。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值