我有一个类Table,它用通用类型K和V声明。这些用作我试图创建其实际数组的内部类Node的参数的数据类型。 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内部类有关,但是对这个问题的实际解决方案使我难以理解,因为我不知道如何处理通用数据类型数组。是的,它必须是一个数组,它是在练习描述中编写的。
编辑:添加城市类。这是一个只有两个参数的简单类。
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作为键,以便轻松地将其拉出进行搜索。我已经使用自定义数据结构进行了此练习,因此我知道该方法有效,但是我无法正确声明通用数据类型数组
最佳答案
您无需使用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所述),您可以放心地取消它。