为什么使用泛型的构造函数失败?

时间:2013-10-06 14:40:37

标签: java generics constructor generic-list generic-programming

我正在创建一个类,目前,它将各种类型的列表存储在名为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))); 1}}(其中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;
        }
    }
}

1 个答案:

答案 0 :(得分:4)

当您已有列表时,您不必使用Arrays.asList()。因此,您将获得一个列表列表,这不是constructr接受的列表。

从javadocs中看到这一点:

  

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

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

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

为了清楚起见,我在评论中添加了这一位:

asList()的方法签名如下: -

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

因为T ... a是一个vararg,当你传入“Larry”,“Moe”,“Curly”时,编译的方法实际上会接收一个["Larry", "Moe", "Curly"]数组,并将它们作为List返回

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