通用擦除概念

时间:2016-06-02 12:28:29

标签: java

请你帮我理解这里的通用概念。

// 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代码时,所有泛型类型 信息被删除(删除)。这意味着用它们的边界替换类型参数 type,如果未指定显式绑定,则为Object,然后应用适当的 强制转换(由类型参数确定)以保持与类型的类型兼容性 由类型参数指定。编译器还强制实现此类型兼容性。

我的问题: - 为什么java编译器在这里抛出错误? 在兼容之后会发生这种情况。

由于

1 个答案:

答案 0 :(得分:3)

有几种方法可以解决这个问题:

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

从内部角度看:
我们假设我们可以使用提供的代码。那它将如何运作?由于删除,new T()会生成Object。但是如果TInteger怎么办?好吧,我们搞砸了。 Object不是Integer,因此我们将获得普通的类播放异常。

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