为什么 List<Map<? extends Number,? extends Number>> 不适用于 List<Map<Integer,Double>>
Why List<Map<? extends Number,? extends Number>> is not working for List<Map<Integer,Double>>
我正在遍历地图,地图的键是图表,值是将显示在图表上的数据集。数据集是地图列表,因为我在每个图表上显示了多个 XYSeries(一个系列 - 一张带有 x 和 y 值的地图)。在某些图表中 x-axis/y-axis 值是双精度值,而在其他图表中是整数。因此,我的数据集类型为 < ?扩展编号>。我究竟做错了什么?
for (Map.Entry<Chart, List<Map<? extends Number, ? extends Number>>> entry : tcInstance.getMapChartDataset().entrySet()) {
switch (entry.getKey().getTitle()) {
case something:
entry.setValue(listOfMaps1);
break;
case something else:
entry.setValue(listOfMaps2);
break;
// other case options
}
}
这些是地图列表的声明:
static List<Map<Integer, Double>> listOfMaps1 = new ArrayList<>();
static List<Map<Double, Double>> listOfMaps2 = new ArrayList<>();
我希望设置值,但我却收到了这些错误,这些错误表明方法 setValue 不适用于参数 (List>)(同样的错误也适用于参数 (List>))。
List<Map<Integer,Double>>
不是 List<Map<? extends Number,? extends Number>>
。
如果是,我可以这样做:
List<Map<Integer,Double>> list = new ArrayList<>();
List<Map<? extends Number,? extends Number>> listX = list; // Doesn't work, pretend it does.
Map<Double,Integer> map = new HashMap<>();
map.put(0.0, 0);
listX.add(map);
for (Map<Integer, Double> e : list) {
Integer i = e.keySet().iterator().next(); // ClassCastException!
}
你会得到一个 ClassCastException
因为 e
有一个 Double
键,而不是预期的 Integer
。
如果您向通配符列表添加额外的上限:
List<? extends Map<? extends Number,? extends Number>>
^-------^ here
那你就不能把map
加到listX
上了,这样就安全了。
我正在遍历地图,地图的键是图表,值是将显示在图表上的数据集。数据集是地图列表,因为我在每个图表上显示了多个 XYSeries(一个系列 - 一张带有 x 和 y 值的地图)。在某些图表中 x-axis/y-axis 值是双精度值,而在其他图表中是整数。因此,我的数据集类型为 < ?扩展编号>。我究竟做错了什么?
for (Map.Entry<Chart, List<Map<? extends Number, ? extends Number>>> entry : tcInstance.getMapChartDataset().entrySet()) {
switch (entry.getKey().getTitle()) {
case something:
entry.setValue(listOfMaps1);
break;
case something else:
entry.setValue(listOfMaps2);
break;
// other case options
}
}
这些是地图列表的声明:
static List<Map<Integer, Double>> listOfMaps1 = new ArrayList<>();
static List<Map<Double, Double>> listOfMaps2 = new ArrayList<>();
我希望设置值,但我却收到了这些错误,这些错误表明方法 setValue 不适用于参数 (List>)(同样的错误也适用于参数 (List>))。
List<Map<Integer,Double>>
不是 List<Map<? extends Number,? extends Number>>
。
如果是,我可以这样做:
List<Map<Integer,Double>> list = new ArrayList<>();
List<Map<? extends Number,? extends Number>> listX = list; // Doesn't work, pretend it does.
Map<Double,Integer> map = new HashMap<>();
map.put(0.0, 0);
listX.add(map);
for (Map<Integer, Double> e : list) {
Integer i = e.keySet().iterator().next(); // ClassCastException!
}
你会得到一个 ClassCastException
因为 e
有一个 Double
键,而不是预期的 Integer
。
如果您向通配符列表添加额外的上限:
List<? extends Map<? extends Number,? extends Number>>
^-------^ here
那你就不能把map
加到listX
上了,这样就安全了。