【发布时间】:2018-05-19 19:57:00
【问题描述】:
我有一个类 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;
}
但是,在其他地方的实际代码中,我尝试使用具体数据类型(City 是我自己的具有 int 和 String 参数的类)调用 Table 的构造函数,如下所示:
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;
}
}
我打算让节点基本上包含 City 的实例作为值和实例的 ID 作为键,以便轻松地将其拉出来进行搜索。我已经使用自定义数据结构进行了此练习,因此我知道该方法有效,但我无法正确声明通用数据类型数组
【问题讨论】:
-
为什么你的
public Table(Class<Node> c){参数是Class<Node> c?为什么要传递代表Class<City>的city.getClass()?基于你调用像new Table<Integer,City>(city.getClass());这样的构造函数的事实,它不应该被声明为public Table(Class<V> c){吗? -
我不知道这是否能如我所愿。虽然节点中的 V 值确实包含 City 类实例,但我需要 K 键用于表中的搜索方法,我不知道如何从 V 值中提取 K。就我相当有限的知识(毕竟我还在做基本的学校练习)这是不可能的。我没有想到我为构造函数使用了错误的参数这一事实。或者更确切地说,确实如此,但我认为这是错误的,原因完全不同。