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

Pre*_*raj 1 java generics type-inference terminology type-erasure

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

Type Erasure:在编译时进程中删除泛型类型信息.

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

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

Box<String> box=new Box<String>();
Run Code Online (Sandbox Code Playgroud)

来自JDK 7:

 Box<String> box=new Box<>();
Run Code Online (Sandbox Code Playgroud)

我猜上面的例子是Type Inference.是对的吗?

Type InferenceType Erasure吗?

Mon*_*... 5

它们都满足不同的需求:

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

另一方面,类型推断是编译器"智能"并且知道您指的是什么类型,即使您实际上没有写它.就像在您的示例中一样,编译器知道Box<>()实际意味着Box<String>()并且允许您继续使用类型安全进行编码,就像您编写的那样Box<String>.这样你就可以编写更简洁的代码,编译器仍然可以理解它.

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