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,它变得更加复杂。