Java-What';类型擦除和类型推断的区别是什么?
类型擦除和类型推断有什么区别?它们都是编译时操作吗 它在编译时过程中删除泛型类型信息Java-What';类型擦除和类型推断的区别是什么?,java,generics,terminology,type-inference,type-erasure,Java,Generics,Terminology,Type Inference,Type Erasure,类型擦除和类型推断有什么区别?它们都是编译时操作吗 它在编译时过程中删除泛型类型信息 示例:Box被转换为类型Box,称为原始类型 与类型擦除有何不同? 在JDK 7之前: Box<String> box=new Box<String>(); Box-Box=newbox(); 来自JDK 7: Box<String> box=new Box<>(); Box-Box=newbox(); 我猜上面的例子是类型推断。是这样吗 Is类型推
- 示例:
被转换为类型Box
,称为原始类型Box
在JDK 7之前:
Box<String> box=new Box<String>();
Box-Box=newbox();
来自JDK 7:
Box<String> box=new Box<>();
Box-Box=newbox();
我猜上面的例子是类型推断。是这样吗
Is
类型推断
与类型擦除
相反?它们都是编译时操作
类型擦除是从通用Java源代码转换回常规Java代码(删除T
、A
和任何其他参数化类型)
当调用泛型方法或创建泛型类型对象时,可能会发生类型推断。例如,如果你
class Box<T> {
...
}
类框{
...
}
那么当你写作的时候
Box<String> box = new Box<>();
// type parameter inferred
Box-Box=newbox();
//推断的类型参数
它们都是编译时操作
类型擦除是从通用Java源代码转换回常规Java代码(删除T
、A
和任何其他参数化类型)
当调用泛型方法或创建泛型类型对象时,可能会发生类型推断。例如,如果你
class Box<T> {
...
}
类框{
...
}
那么当你写作的时候
Box<String> box = new Box<>();
// type parameter inferred
Box-Box=newbox();
//推断的类型参数
这两种服务的需求完全不同:
类型擦除就像您所说的,是必需的,因为java字节码不是泛型的,因此您需要删除类型。这不是一个可以帮助您编写代码的特性,它只是jvm为了理解您的代码而必须进行的自动编译时更改
另一方面,类型推断是编译器是“聪明”的,并且知道您所引用的类型,即使您实际上并没有编写它。就像在您的示例中一样,编译器知道Box()
实际上意味着Box()
,并允许您继续使用类型安全性编码,就像编写Box
一样。通过这种方式,您可以编写更少的冗长代码,并且编译器仍然能够理解它
您可以从中了解到,Java中的泛型实际上主要是一种编译时功能,它可以让您更安全地编写代码,并帮助您在编译时而不是运行时发现错误。它们都满足完全不同的需求: 类型擦除就像您所说的,是必需的,因为java字节码不是泛型的,因此您需要删除类型。这不是一个可以帮助您编写代码的特性,它只是jvm为了理解您的代码而必须进行的自动编译时更改 另一方面,类型推断是编译器是“聪明”的,并且知道您所引用的类型,即使您实际上并没有编写它。就像在您的示例中一样,编译器知道
Box()
实际上意味着Box()
,并允许您继续使用类型安全性编码,就像编写Box
一样。通过这种方式,您可以编写更少的冗长代码,并且编译器仍然能够理解它
您可以从中了解到,Java中的泛型实际上主要是一种编译时功能,它可以让您更安全地编写代码,并帮助您在编译时而不是运行时发现错误。只有第二个示例涉及类型推断,而且是最简单的类型。使用Java8中的lambdas,它变得更加复杂。只有第二个示例涉及类型推断,而且是最简单的类型。使用Java8中的lambdas,它变得更加复杂。