通用擦除概念

你能帮我理解这里的通用概念吗?

// Can't create an instance of T. class Gen { T ob; Gen() { ob = new T(); // Illegal!!! } public static void main() { Gen genobj = new Gen(); //Error } } 

编译Java代码时,将删除(擦除)所有generics类型信息。 这意味着用它们的绑定类型替换类型参数,如果没有指定显式绑定,则为Object,然后应用适当的转换(由类型参数确定)以保持类型与类型参数指定的类型的兼容性。 编译器还强制实施此类型兼容性。

我的问题: – 为什么java编译器在这里抛出错误? 在完成后会因此而失败。

谢谢

有几种方法可以在这里解决:

从逻辑POV:
甚至不能保证你使用的模板参数T都有一个默认构造函数。 这显然提供了如何处理缺省构造函数缺失的问题。 可能的解决方案是产生运行时错误,编译时错误或禁止任何不提供默认构造函数的T 后者显然会破坏模板定义,这允许任何 T 并且运行时错误会使事情变得复杂并且产生与上面提到的相同的问题。 仍然是首先阻止此行为并抛出编译时错误。

从内部角度来看:
我们假设我们可以使用提供的代码。 那它将如何运作? 由于擦除, new T()会产生一个Object 。 但如果TInteger呢? 好吧,我们搞砸了。 Object不是Integer ,因此我们将得到一个普通的类转换exception。

总而言之:允许上面的编译不适用于实际的POV,另外打破了java中generics的当前定义。