当前位置: 首页 > 知识库问答 >
问题:

为什么我们不能在泛型类中创建一个“具体”类的数组?

戚星腾
2023-03-14
public class GenericClass<T> {

    class MyClass {
    }

    public GenericClass(final T[] param) {
        MyClass myObject = new MyClass();                       // OK
        MyClass[] myArray = { new MyClass(), new MyClass() };   // Cannot create a generic array of GenericClass<T>.MyClass
    }
}

这不是创建泛型数组。编译器理解/确定MyClass应该没有问题,不是吗?

共有3个答案

张鸿志
2023-03-14

涵盖这一点的JLS部分是10.6。具体来说,这是因为:

如果ClassOrInterfaceType不表示可实现类型(4.7),则是一个编译时错误。否则,ClassOrInterfaceType可以命名任何命名的引用类型,甚至是抽象类类型(8.1.1.1)或接口类型(9)。

上述规则意味着数组创建表达式中的元素类型不能是参数化类型,而不是无界通配符。

因为MyClass是非静态的,所以它依赖于外部类;它实际上是泛型类

奇怪的是如果你这样做。

class MyClass<T> {
}

public GenericClass(final T[] param) {
    MyClass[] myArray = { new MyClass(), new MyClass() };  
}

这是合法的。有点古怪,有点笨拙,但是合法。因为您重新声明了类型,所以它隐藏了外部的类型。然后...数组和泛型不能混用...除非使用原始类型。为了向后兼容,你可以有一个rawtype数组来保存< code>MyClass

柯乐童
2023-03-14

下面是一些其他信息。从链接...

Java数组携带运行时类型信息,标识所包含元素的类型

到编译器,您的代码如下所示:

MyClass[] myArray = {new GenericClass<T>.MyClass(), ..} //T is unknown
姬向明
2023-03-14

内部类“知道”封闭类的哪个实例创建了它们,并且可以访问这个实例的字段/成员。就好像它们有第二个< code>this变量,其类型是封闭类的具体类型(例如< code>GenericClass

为了克服这种困境,您可以使MyClass静态。这将使它与封闭类的任何实例完全解耦(也就是说:它不会有第二个this),因此它们可以自由实例化:

public class GenericClass<T> {

  static class MyClass {
  }

  public GenericClass(final T[] param) {
    MyClass myObject = new MyClass();                       // OK
    MyClass[] myArray = { new MyClass(), new MyClass() };   
  }
}
 类似资料:
  • 问题内容: 我有一个普通班和一个具体班。如何创建类型数组? 我试过: 但是我得到了ClassCastException。 但是,当我尝试时: 效果很好。 问题答案: 使用原始类型创建数组:

  • 问题内容: 我正在使用泛型编写某些东西,令我惊讶的是,我发现这行不通: 那我不能实例化泛型吗?没有任何方法可以做到这一点吗? 问题答案: 是的,这真是令人讨厌。 我使用的解决方法是强制客户端在构造新类时传递类-即 然后您可以使用。

  • 此代码有效。它以“未检查或不安全操作”警告进行编译和运行。 当这两个给我运行时错误时 我遇到的错误如下:

  • 问题内容: 我明白: 由于抽象类本身并不是什么,例如车辆,我们想要创建一个具体实现的对象,例如Car,Bike等。 对象链期间将调用抽象类的构造函数。 我们永远不能直接创建抽象类的对象,即使它包含构造函数并且所有方法都已实现。 但是从编译器的角度来看,Java为什么要强制执行这些规则? 问题答案: 这不是技术限制,而是(如您所指出的)逻辑上的限制。Java(和许多其他语言)执行各种规则不是因为它们

  • 问题内容: 我有一个通用的抽象模板类。我以为如果创建特定于类型的生产者,则可以直接在通用类中注入一些DAO服务。但是我不能。 为什么?我该如何解决? 当我注入一个例如它完美地工作。但是没有泛型… 问题答案: 当您要求 容器知道您要一个类型为的bean 。如果存在这样的bean并且其类型信息已知,则容器可以满足注入。例如,类型信息保留在带注释的方法中 容器使用反射来检索该参数化的类型,并将其与请求的