【问题标题】:Java - What's the difference between type erasure and type inference?Java - 类型擦除和类型推断有什么区别?
【发布时间】:2015-07-26 08:57:56
【问题描述】:

类型擦除和类型推断有什么区别?它们都是编译时操作吗?

Type Erasure: 在编译时删除泛型类型信息。

  • 示例:Box<String> 被转换为类型Box,称为原始类型。

Type Inference 与 Erasure 类型有何不同?
JDK 7 之前:

Box<String> box=new Box<String>();

从 JDK 7 开始:

 Box<String> box=new Box<>();

我猜上面的例子是类型推断。对吗?

Type Inference 是否与Type Erasure 相对?

【问题讨论】:

  • 只有您的第二个示例涉及类型推断,并且是最简单的类型。使用 Java 8 中的 lambda,它变得更加复杂。

标签: java generics terminology type-inference type-erasure


【解决方案1】:

它们都满足完全不同的需求:

类型擦除就像你说的那样是需要的,因为 java 字节码不是通用的,因此你需要删除打字。这不是帮助您编写代码的功能,它只是 jvm 必须发生的自动编译时间更改才能理解您的代码。

另一方面,类型推断是编译器是“智能的”并且知道你指的是什么类型,即使你实际上并没有编写它。就像在您的示例中一样,编译器知道Box&lt;&gt;() 实际上意味着Box&lt;String&gt;(),并让您继续使用类型安全进行编码,就像您编写Box&lt;String&gt; 一样。这样你可以编写更少冗长的代码,编译器仍然可以理解它。

您可以从所有这些中了解到,Java 中的泛型实际上主要是编译时的事情,它可以让您更安全地编写代码,并帮助您在编译时而不是运行时发现错误。

【讨论】:

    【解决方案2】:

    它们都是编译时操作。

    类型擦除是将通用 Java 源代码转换回常规 Java 代码(删除 TA 和任何其他参数化类型)。

    类型推断可以在调用泛型方法或创建泛型类型对象时发生。例如,如果您

    class Box<T> {
        ...
    }
    

    那么当你写

    Box<String> box = new Box<>();
    // type parameter inferred
    

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 2016-02-14
      • 2012-05-02
      • 2013-12-27
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多