【问题标题】:Generic Erasure concept通用擦除概念
【发布时间】:2016-06-02 20:50:47
【问题描述】:

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

// 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 。

谢谢

【问题讨论】:

  • 编译后,类型T被删除,所以程序不会知道你要实例化的类型。
  • 如果我错了请纠正我。'T' 替换为 Java.lang.Object
  • Gen genobj=new Gen() 编译后它将是 Gen genobj=new Gen()
  • T 不替换为 Object 类型。 T 被您编程接受的任何内容替换,方法是在您将其称为 Gen gen = new Gen(); 时提供一个类型。如果你想创建一个新的“T”类型,那么你必须使用 T.newInstances(); Instantiating generics type in java你想做什么,你的代码没有意义。

标签: java


【解决方案1】:

这里有几种可行的方法:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多