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

Java - What's the difference between type erasure and type inference?

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

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

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

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

来自 JDK 7:

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

My guess the above examples are Type Inference. Is that right?

Type InferenceType Erasure是相反的吗?

它们都是编译时操作。

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

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

class Box<T> {
    ...
}

然后当你写

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

两者满足完全不同的需求:

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

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

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