Java - 类型擦除和类型推断之间的区别是什么?

时间:2015-07-26 08:57:57

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

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

键入Erasure :在编译时进程中删除泛型类型信息。

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

类型推断如何与类型擦除不同?
在JDK 7之前:

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

来自JDK 7:

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

我的猜测上面的例子是Type Inference。是吗?

Type Inference是否与Type Erasure相反?

2 个答案:

答案 0 :(得分:5)

它们都有完全不同的需求:

类型擦除就像你说的那样,并且是必需的,因为java字节代码不是通用的,因此你需要删除键入。这不是一个可以帮助您编写代码的功能,只是一个自动编译时间更改,必须让jvm理解您的代码。

另一方面,类型推断是编译器是&#34; smart&#34;并且知道你指的是什么类型,即使你没有真正写它。就像在您的示例中一样,编译器知道Box<>()实际上意味着Box<String>()并且允许您继续使用类型安全进行编码,就像您编写Box<String>一样。通过这种方式,您可以编写较少详细的代码,编译器仍然可以理解它。

您可以从中了解到,Java中的泛型实际上主要是编译时间,它可以让您更安全地编写代码,并帮助您在编译时而不是运行时查找错误。

答案 1 :(得分:3)

它们都是编译时操作。

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

当调用泛型方法或创建泛型类型对象时,可能会发生类型推断。例如,如果你

class Box<T> {
    ...
}

然后当你写

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