通用擦除概念[英] Generic Erasure concept

问题描述

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

// Can't create an instance of T.
class Gen<T> {
  T ob;

  Gen() {
    ob = new T(); // Illegal!!!
  }

  public static void main() {

    Gen<Integer> genobj = new Gen<Integer>(); //Error
  }
}

当你的 Java 代码被编译时,所有的泛型类型信息被删除(删除).这意味着用它们的边界替换类型参数类型,如果未指定显式边界,则为 Object,然后应用适当的强制转换(由类型参数确定)以保持与类型的类型兼容性由类型参数指定.编译器还强制执行这种类型的兼容性.

我的问题:-为什么 java 编译器在这里抛出错误?complitiion 后 Bevause .

谢谢

推荐答案

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

从逻辑 POV:
甚至不能保证您使用的任何模板参数 T 都具有默认构造函数.这显然提供了如何处理缺少默认构造函数的问题.可能的解决方案是产生运行时错误、编译时错误或禁止任何不提供默认构造函数的 T.后者显然会破坏允许 any T 的模板定义.并且运行时错误会使事情变得相当复杂,并产生与上述相同的问题.仍然首先防止这种行为并引发编译时错误.

从内部看:
假设我们可以使用提供的代码.那么它将如何工作?由于擦除,new T() 会产生一个 Object.但是如果 T 是 Integer 呢?好吧,我们搞砸了.Object 不是 Integer,所以我们会得到一个普通的类转换异常.

总而言之:从实际的 POV 中编译上述内容是行不通的,此外还会破坏 Java 中当前对泛型的定义.

本文地址:https://www.itbaoku.cn/post/978689.html