我正在运行以下代码。但是当我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)的方法
答案 0 :(得分:0)
sumPair
被声明为List<int[]>
。 currentSumPairs
也被声明为List<int[]>
,这意味着它是一个包含List
(int[]
数组)实例的int
。因此您不能将sumPair
放入currentSumPairs
,因为它不是int[]
类型。
答案 1 :(得分:0)
由于sumPair是一个列表,因此应该为
currentSumPairs.addAll(sumPair);
答案 2 :(得分:0)
currentSumPairs
和sumPair
的类型为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"。