没有合适的添加方法

时间:2018-10-18 13:20:53

标签: java arraylist

我正在运行以下代码。但是当我currentSumPairs.add(sumPair)

出现此错误
List<List<Integer>> quadrupules = new ArrayList<List<Integer>>();
Map<Integer, List<int[]>> pairs = new HashMap<Integer, List<int[]>>();      
List<int[]> sumPair = new ArrayList<int[]>();

sumPair.add(new int[]{1, 2});

if (pairs.containsKey(0)) {
    List<int[]> currentSumPairs = pairs.get(0);
    currentSumPairs.add(sumPair);
    pairs.put(0, currentSumPairs);
} else {    
    pairs.put(0, sumPair);
} 

这会出现以下错误:

  

找不到适合add(List)的方法

4 个答案:

答案 0 :(得分:0)

sumPair被声明为List<int[]>currentSumPairs也被声明为List<int[]>,这意味着它是一个包含Listint[]数组)实例的int。因此您不能将sumPair放入currentSumPairs,因为它不是int[]类型。

答案 1 :(得分:0)

由于sumPair是一个列表,因此应该为

currentSumPairs.addAll(sumPair);

答案 2 :(得分:0)

currentSumPairssumPair的类型为List<int[]>.add()方法期望使用int[]。您不能添加List<int[]>来代替int[],它们是不一样的。

我认为您正在寻找addAll(...)方法。

currentSumPairs.addAll(sumPair);

答案 3 :(得分:0)

小的添加

带有数组的用法泛型,例如List<int[]>,兼容性很差,因此不建议使用,因为它可能导致灾难性的结果。 这可能会导致所有类型的错误,并导致您确实不想遇到的错误。

就像约书亚·布洛赫(Joshua Bloch)在他的书"Effective Java"中所提到的,至少数组和泛型的任何组合都是不希望的,因为它们之间存在实质性差异。

  

首先,数组是协变的。[..]相反,泛型是不变的。

例如

说到数组,这是一段完全合法的代码,它将顺利编译。但是,如果您尝试将SubObject保留在数组中,它将在运行时失败。

    SuperObject[] arrayOfCustomObjects = new SubObject[1] // Fails at runtime, throws ArrayStoreException

泛型(在这种情况下为List)是不变的,因此不允许创建子类型的列表实例,从而在运行时失败。它必须是完全相同的类型。

   List<SuperObject> listOfCustomObjects = new ArrayList<SubObject> // Won't compile, must be the same types, fail-fast
  

数组是 reified 。这意味着数组在运行时知道并强制其元素类型。[..]

     相反,泛型是通过擦除实现的。这意味着它们仅在编译时强制执行其类型约束,而在运行时丢弃(或擦除)其元素类型信息。擦除是允许泛型类型与不使用泛型的旧代码自由互操作的原因,从而确保在Java 5中顺利过渡到泛型。

     

由于这种基本差异,数组和泛型不能很好地混合使用。   例如,创建通用类型,参数化类型或类型参数的数组是非法的。

Joshua Bloch,“有效Java”(第3版)

有关更多信息,请检出"Effective Java"