类型擦除和类型推断之间的区别是什么?它们都是编译时操作吗?
键入Erasure :在编译时进程中删除泛型类型信息。
Box<String>
已转换为Box
类型,称为原始类型。类型推断如何与类型擦除不同?
在JDK 7之前:
Box<String> box=new Box<String>();
来自JDK 7:
Box<String> box=new Box<>();
我的猜测上面的例子是Type Inference。是吗?
Type Inference
是否与Type Erasure
相反?
答案 0 :(得分:5)
它们都有完全不同的需求:
类型擦除就像你说的那样,并且是必需的,因为java字节代码不是通用的,因此你需要删除键入。这不是一个可以帮助您编写代码的功能,只是一个自动编译时间更改,必须让jvm理解您的代码。
另一方面,类型推断是编译器是&#34; smart&#34;并且知道你指的是什么类型,即使你没有真正写它。就像在您的示例中一样,编译器知道Box<>()
实际上意味着Box<String>()
并且允许您继续使用类型安全进行编码,就像您编写Box<String>
一样。通过这种方式,您可以编写较少详细的代码,编译器仍然可以理解它。
您可以从中了解到,Java中的泛型实际上主要是编译时间,它可以让您更安全地编写代码,并帮助您在编译时而不是运行时查找错误。
答案 1 :(得分:3)
它们都是编译时操作。
类型擦除是从通用Java源代码转换回常规Java代码(删除T
,A
和任何其他参数化类型。)
当调用泛型方法或创建泛型类型对象时,可能会发生类型推断。例如,如果你
class Box<T> {
...
}
然后当你写
Box<String> box = new Box<>();
// type parameter inferred