我有一个类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所述),您可以放心地取消它。

07-28 03:06
查看更多