Java - 类型擦除和类型推断有什么区别?
Java - What's the difference between type erasure and type inference?
类型擦除和类型推断有什么区别?它们都是编译时操作吗?
Type Erasure: 在编译时过程中删除泛型类型信息。
- 示例:
Box<String>
转换为类型 Box
,称为原始类型。
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 Inference
和Type Erasure
是相反的吗?
它们都是编译时操作。
类型擦除是从通用 Java 源代码转换回常规 Java 代码(删除 T
、A
和任何其他参数化类型)。
当调用泛型方法或创建泛型类型对象时,可能会发生类型推断。例如,如果您
class Box<T> {
...
}
然后当你写
Box<String> box = new Box<>();
// type parameter inferred
两者满足完全不同的需求:
类型擦除就像您所说的那样,并且是必需的,因为 java 字节代码不是通用的,因此您需要删除类型。这不是帮助您编写代码的功能,它只是一个自动编译时间更改,jvm 必须发生这种更改才能理解您的代码。
另一方面,类型推断是编译器 "smart" 并且知道您指的是什么类型,即使您实际上并没有编写它。就像在您的示例中一样,编译器知道 Box<>()
实际上意味着 Box<String>()
并允许您继续使用类型安全编码,就像您编写 Box<String>
一样。这样您就可以编写不那么冗长的代码,并且编译器仍然可以理解它。
你可以从所有这些中了解到 Java 中的泛型实际上主要是编译时的东西,它可以让你更安全地编码并帮助你在编译时发现错误而不是 运行 -时间。
类型擦除和类型推断有什么区别?它们都是编译时操作吗?
Type Erasure: 在编译时过程中删除泛型类型信息。
- 示例:
Box<String>
转换为类型Box
,称为原始类型。
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 Inference
和Type Erasure
是相反的吗?
它们都是编译时操作。
类型擦除是从通用 Java 源代码转换回常规 Java 代码(删除 T
、A
和任何其他参数化类型)。
当调用泛型方法或创建泛型类型对象时,可能会发生类型推断。例如,如果您
class Box<T> {
...
}
然后当你写
Box<String> box = new Box<>();
// type parameter inferred
两者满足完全不同的需求:
类型擦除就像您所说的那样,并且是必需的,因为 java 字节代码不是通用的,因此您需要删除类型。这不是帮助您编写代码的功能,它只是一个自动编译时间更改,jvm 必须发生这种更改才能理解您的代码。
另一方面,类型推断是编译器 "smart" 并且知道您指的是什么类型,即使您实际上并没有编写它。就像在您的示例中一样,编译器知道 Box<>()
实际上意味着 Box<String>()
并允许您继续使用类型安全编码,就像您编写 Box<String>
一样。这样您就可以编写不那么冗长的代码,并且编译器仍然可以理解它。
你可以从所有这些中了解到 Java 中的泛型实际上主要是编译时的东西,它可以让你更安全地编码并帮助你在编译时发现错误而不是 运行 -时间。