通用数组创建错误

4

我正在尝试创建一个具有通用顶点和邻接列表的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
@downvoter:为什么被踩了?我看不出这个问题有什么问题! - home
3个回答

2

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

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

/e1
这仍然存在一个问题,即如何获取Class<T>对象。最好(我能想到的唯一方法)是在构造函数中再添加一个参数来获取类对象。


1

不要将数组与集合混用,只使用集合:

private List<HashSet<T>> adjacent;

您可以选择使用ArrayList作为列表实现。它具有相同的效率并且更加灵活。


谢谢。现在我没有收到任何错误,只有未选中/不安全的操作警告。 - Rohit Agarwal

1

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

你有两个选择:

  1. 使用类型为 Object[] 的变量。当你取出元素并想将其用作 T 时,可能需要进行强制转换。
  2. 使用类型为 T[] 的变量(vertex = (T[]) new Object[numVertices];)。这样做的好处是在取出东西时不必强制转换为 T。但是,你必须确保不要将此引用传递或返回给期望 T[] 的类之外的代码,否则会导致类转换异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接