我正在尝试使用通用顶点和邻接列表创建一个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];
}
}
答案 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[]
,它可以包含任何对象。
您有两种选择:
Object[]
类型的变量。当您获取元素并希望将其用作T
时,您可能需要转换为T
。T[]
(vertex = (T[]) new Object[numVertices];
)类型的变量。这样可以方便您在解决问题时不必转换为T
。但是,您必须确保不要将此引用传递给返回到期望T[]
的类之外的代码,这将导致类强制转换异常。