通用数据类型数组创建,其中类型是内部类

时间:2018-05-19 19:57:01

标签: java generics types

我有一个类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作为键,以便轻松将其用于搜索。我已经使用自定义数据结构进行了此练习,因此我知道该方法有效,但我无法正确声明通用数据类型数组

1 个答案:

答案 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所述),您可以安全地将其抑制。