首页 > Java > java教程 > 正文

为什么将原始类型与泛型方法一起使用会导致意外行为?

Linda Hamilton
发布: 2024-11-20 15:27:12
原创
660 人浏览过

Why Does Using Raw Types With Generic Methods Result in Unexpected Behavior?

使用泛型方法了解原始类型的行为

使用 Java 的泛型时,了解使用原始类型的含义至关重要及其对通用方法的影响。让我们深入研究一个特定的代码示例,并探讨原始类型如何影响方法解析。

考虑以下代码片段,其中创建字符串的 ArrayList 并将其转换为数组:

ArrayList<String> a = new ArrayList<String>();
String[] s = a.toArray(new String[0]);
登录后复制

正如预期的那样,此代码在 Java 1.6 和 1.7 中成功编译。但是,如果 ArrayList 引用被声明为原始类型,则编译期间会发生错误:

ArrayList a = new ArrayList();
String[] s = a.toArray(new String[0]); // Error: Argument required String[] found Object[]
登录后复制

在这种情况下,编译器将泛型方法 toArray(myArray) 解释为返回 Object[],尽管接收到String[] 作为其参数。这种行为是非常出乎意料的,因为方法签名明确指定了类型参数

要理解这一点,让我们考虑 Java 语言规范 (JLS) 第 4.8 节。它指出“未从其超类或超接口继承的原始类型 C 的实例方法 M 的类型是与 C 对应的泛型声明中其类型的擦除相对应的原始类型。”

本质上,当使用原始类型时,编译器基本上会丢弃所有类型信息,只留下类的原始表示形式。这意味着,在我们的示例中,toArray 方法实际上成为具有 Object[] 返回类型的非泛型方法,即使它最初被定义为泛型方法。

原始类型中通用性的丧失具有重要的含义:

  • 使用原始类型会使您的代码更容易受到运行时类型错误的影响。
  • 使用原始类型时可能并不总是会触发编译器警告,从而导致潜在的错误。

通常建议避免使用原始类型,而是依靠泛型来实现类型安全性和灵活性。但是,了解原始类型的行为可以帮助您解决问题并在特定场景中做出明智的决策。

以上是为什么将原始类型与泛型方法一起使用会导致意外行为?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板