我有一个类Table,它使用泛型类型K和V声明。这些用作内部类Node参数的数据类型,我试图创建实际的Array。类Table的相关代码如下:
public class Table<K extends Comparable<K>, V> implements ITable<K,V> {
private int numberOfElements;
private boolean sorted;
private Node[] list;
//inner class
private class Node{
K key;
V value;
public Node(K key, V value) {
this.key = key;
this.value = value;
}
}
//constructor
public Table(Class<Node> c){
this.numberOfElements = 0;
sorted = false;
list = (Node[])Array.newInstance(c,1000);
this.list = list;
}
但是在其他地方的实际代码中,我尝试使用具体的数据类型调用Table的构造函数(City是我自己的类,带有int和String参数),如下所示:
Table<Integer,City> table = new Table<Integer,City>(city.getClass());
我收到错误:Class<CAP#1> cannot be converted into class <Table<Integer,City>.Node> CAP#1 extends City from capture of ? extends City
。
我假设这与Node是Table类声明中不存在的Table的内部类有关,但是对于这个问题的实际解决方法让我不知所措,因为我不知道如何处理泛型数据类型数组。是的,它必须是一个数组,它是用练习描述写的。
编辑:添加City类。这是一个只有两个参数的简单类。
public class City {
public String name;
public int ID;
public City(String name, int iD) {
this.name = name;
this.ID = iD;
}
public String getName() {
return name;
}
public int getiD() {
return ID;
}
public void setName(String name) {
this.name = name;
}
public void setiD(int iD) {
this.ID = iD;
}
}
我打算让Node基本上包含City的实例作为值,并将实例的ID作为键,以便轻松将其用于搜索。我已经使用自定义数据结构进行了此练习,因此我知道该方法有效,但我无法正确声明通用数据类型数组
答案 0 :(得分:2)
您不需要使用Array.newInstance
,因为组件类型是静态知道的,它是Node
。在构造函数中,您不能这样做:
this.list = new Node[1000];
因为这隐式使用Table<K, V>.Node
,这是通用的,您不能创建通用数组。但是你可以使用:
this.list = new Table.Node[1000];
然后从构造函数中删除Class<Node>
参数,您可以将其称为:
Table<Integer, City> table = new Table<>();
您将获得一个未经检查的警告,用于将原始数组类型转换为通用数组类型(如注释中的newacct所述),您可以安全地将其抑制。