资讯专栏INFORMATION COLUMN

Java™ 教程(泛型原始类型)

史占广 / 1336人阅读

泛型原始类型

原始类型是没有任何类型参数的泛型类或接口的名称,例如,给定Box泛型类:

public class Box {
    public void set(T t) { /* ... */ }
    // ...
}

要创建参数化类型的Box,请为形式类型参数T提供实际类型参数:

Box intBox = new Box<>();

如果省略实际的类型参数,则创建一个原始类型Box

Box rawBox = new Box();

因此,Box是泛型Box的原始类型,但是,非泛型类或接口类型不是原始类型。

原始类型出现在遗留代码中,因为许多API类(例如Collections类)在JDK 5.0之前不是泛型的,使用原始类型时,你实际上获得预泛型行为 — Box会为你提供Object,为了向后兼容,允许将参数化类型分配给其原始类型:

Box stringBox = new Box<>();
Box rawBox = stringBox;               // OK

但是,如果将原始类型分配给参数化类型,则会收到警告:

Box rawBox = new Box();           // rawBox is a raw type of Box
Box intBox = rawBox;     // warning: unchecked conversion

如果使用原始类型调用相应泛型类型中定义的泛型方法,也会收到警告:

Box 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 bi;
        bi = createBox();
    }

    static Box createBox(){
        return new Box();
    }
}

术语“unchecked”表示编译器没有足够的类型信息来执行确保类型安全所必需的所有类型检查,默认情况下,“unchecked”警告被禁用,尽管编译器会提示,要查看所有“unchecked”警告,请使用-Xlint:unchecked重新编译。

使用-Xlint:unchecked重新编译上一个示例显示以下附加信息:

WarningDemo.java:4: warning: [unchecked] unchecked conversion
found   : Box
required: Box
        bi = createBox();
                      ^
1 warning

要完全禁用使用-Xlint:-unchecked标志的未经检查的警告,@SuppressWarnings("unchecked")注解会抑制未经检查的警告,如果你不熟悉@SuppressWarnings语法,请参阅注解。

上一篇:泛型类型 下一篇:泛型方法

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72925.html

相关文章

  • Java教程泛型类型

    泛型类型 泛型类型是通过类型参数化的泛型类或接口,修改以下Box类以演示此概念。 一个简单的Box类 首先检查一个对任何类型的对象进行操作的非泛型Box类,它只需要提供两个方法:set,它将一个对象添加到box中,get,它将检索它: public class Box { private Object object; public void set(Object object) ...

    Crazy_Coder 评论0 收藏0
  • Java教程(自动装箱和拆箱)

    自动装箱和拆箱 自动装箱是Java编译器在基元类型和相应的对象包装类之间进行的自动转换,例如,将int转换为Integer,将double转换为Double,依此类推,如果转换是另一种方式,则称为拆箱。 以下是自动装箱的最简单示例: Character ch = a; 本节中的其余示例使用泛型,如果您还不熟悉泛型的语法,请参阅泛型课程。 考虑以下代码: List li = new ArrayLis...

    cuieney 评论0 收藏0
  • Java教程泛型的限制)

    泛型的限制 要有效地使用Java泛型,必须考虑以下限制: 无法使用基元类型实例化泛型类型 无法创建类型参数的实例 无法声明类型为类型参数的静态字段 无法对参数化类型使用强制类型转换或instanceof 无法创建参数化类型的数组 无法创建、捕获或抛出参数化类型的对象 无法重载将每个重载的形式参数类型擦除为相同原始类型的方法 无法使用基元类型实例化泛型类型 考虑以下参数化类型: class P...

    Bowman_han 评论0 收藏0
  • Java教程类型擦除)

    类型擦除 泛型被引入到Java语言中,以便在编译时提供更严格的类型检查并支持通用编程,为了实现泛型,Java编译器将类型擦除应用于: 如果类型参数是无界的,则用它们的边界或Object替换泛型类型中的所有类型参数,因此,生成的字节码仅包含普通的类、接口和方法。 如有必要,插入类型转换以保持类型安全。 生成桥接方法以保留扩展泛型类型中的多态性。 类型擦除确保不为参数化类型创建新类,因此,泛型不会...

    zsy888 评论0 收藏0
  • Java教程(目录)

    Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...

    lifesimple 评论0 收藏0

发表评论

0条评论

史占广

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<