我正在创建一个类,该类目前在称为genericTable
的内部对象中存储各种类型的列表。每个列表(由Double
或Long
组成)都保存在作为类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/