我正在创建一个类,该类目前在称为genericTable的内部对象中存储各种类型的列表。每个列表(由DoubleLong组成)都保存在作为类GenericList实例的对象中。

问题:addVector方法为什么不起作用?

红色下划线下的错误为the constructor Test<V>.GenericList<V>(List<List<V>>) is undefined

如果我正在使用main方法(但具有相同的GenericList类)并在main方法内创建了genericTable(使用List<GenericList<?>> Table = new ArrayList<GenericList<?>>();)并做了genericTable.add(new GenericList<Long>(Arrays.asList(genericVector)));(在这种情况下,genericVector是一个List<Long>),它可以完美运行。

public class Test<V> {

    private final List<GenericList<?>> genericTable = new ArrayList<GenericList<?>>();

    public void addVector(List<V> genericVector) {
        genericTable.add(new GenericList<V>(Arrays.asList(genericVector)));
    }

    private class GenericList<K> {
        private final List<K> listGeneric;

        public GenericList(List<K> input) {
           listGeneric = input;
        }
    }
}

最佳答案

当您已有列表时,就不必要使用Arrays.asList()。因此,您将获得一个列表列表,这不是构造方法所接受的。

从javadocs看到这一点:


  此方法还提供了创建固定大小列表的便捷方法
  初始化为包含几个元素:

 List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");



因此,在您的情况下,您将获得列表列表,而不是字符串列表。

为了清楚起见,我在评论中添加了以下内容:

asList()的方法签名如下:

public static <T> List<T> asList(T... a)


因此,由于T ... a是一个变量,因此当您传入“ Larry”,“ Moe”,“ Curly”时,编译后的方法实际上会接收一个["Larry", "Moe", "Curly"]数组,并将其作为List返回。

因此,由于您传入的是List,而不是数组,因此该方法采用vararg数组,如下所示:[genericVector],并将该数组作为列表返回,构造函数中断。

关于java - 为什么使用泛型的此构造函数失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19210041/

10-12 06:29