通用数组创建错误

时间:2011-09-11 15:03:04

标签: java arrays generics

我正在尝试使用通用顶点和邻接列表创建一个Graph类,并且我在以下代码的第10行遇到了泛型数组创建错误。早些时候我在第11行遇到了同样的错误,但它是通过投射解决的。但这个错误仍然存​​在。代码有什么问题?

import java.util.HashSet;

public class Graph<T> {
    private int numVertices;
    private T[] vertex;
    private HashSet<T>[] adjacent;

    public Graph(int numVertices) {
            this.numVertices = numVertices;
            vertex = (T[]) new T[numVertices];
            adjacent = (HashSet<T>[]) new HashSet[numVertices];
    }
}

3 个答案:

答案 0 :(得分:2)

由于类型擦除,您无法在java中创建通用数组。

但是,您可以使用Array.newInstance(Class<T>, int)为您创建一个。您必须将返回的Object转换为T[]

/ E1
这仍然存在获得Class<T>对象的问题。这样做的最好(我能想到的唯一方法)是在构造函数中使用另一个参数来获取类对象。

答案 1 :(得分:1)

不要将数组与集合混合。仅使用集合:

private List<HashSet<T>> adjacent;

然后,您可以选择将ArrayList用作List实现。它同样高效,灵活。

答案 2 :(得分:1)

您无法创建未知类型的数组(因为数组在运行时包含其组件类型)。但为了您的目的,您只需要创建一个Object[],它可以包含任何对象。

您有两种选择:

  1. 使用Object[]类型的变量。当您获取元素并希望将其用作T时,您可能需要转换为T
  2. 使用T[]vertex = (T[]) new Object[numVertices];)类型的变量。这样可以方便您在解决问题时不必转换为T。但是,您必须确保不要将此引用传递给返回到期望T[]的类之外的代码,这将导致类强制转换异常。