【问题标题】:Disallowed generic array creation in Java不允许在 Java 中创建泛型数组
【发布时间】:2015-06-19 16:27:16
【问题描述】:

我以为我明白你不能在 Java 中创建泛型类的数组,但是我最近看到的一些例子让我很困惑。有人可以解释吗?谢谢!

我有一个泛型类定义为:public class Bag<Item> implements Iterable<Item>

现在在一个名为 EdgeWeightedGraph(如下)的类中,我正在制作一个 Bag 数组,并且编译得很好。如果 Bag 不是泛型类,我知道这应该没问题,但在这里,它是。那为什么编译器不报错呢?

public class EdgeWeightedGraph {

private final int V;
private final Bag[] adj;

    public EdgeWeightedGraph(int V) {
        this.V = V;
        adj = new Bag[V];
    }
}

虽然它在另一个定义为的泛型类中引发错误:

public class MinPQ<Key extends Comparable<Key>> {

private Key[] pq;

    public MinPQ() {
        pq = new Key[2];
    }
}

【问题讨论】:

    标签: java arrays generics


    【解决方案1】:

    EdgeWeightedGraph 中,此行不创建泛型数组。

    adj = new Bag[V];
    

    它正在创建一个原始类型的数组,这是允许的。 Bag 是一个类,不是类型参数。

    但是,在MinPQ 中,Key 是一个类型参数,而不是一个类,所以这一行试图创建一个泛型数组并且是一个编译器错误。

    pq = new Key[2];
    

    【讨论】:

      【解决方案2】:

      Bag 是原始类型。它不是通用的。泛型类型例如是Bag&lt;Integer&gt;

      所以下面的编译:

      adj = new Bag[V];  // compiles
      

      但以下没有

      adj = new Bag<Integer>[V]; // error
      

      至于Key,它是一个类型参数,而不是像Bag这样的原始类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        • 1970-01-01
        相关资源
        最近更新 更多