为什么列出<map <? extend =“” number,?=“” extend =“” number =“” >>不适用于List <map <integer,double >>

时间:2019-05-29 08:41:47

标签: java generics wildcard bounded-wildcard

我正在遍历一个地图,该地图的键是图表,值是将在图表上显示的数据集。数据集是地图列表,因为我在每个图表上都显示了多个XYSeries(一个系列-一个具有x和y值的地图)。在某些图表中,x轴/ y轴值为Doubles,在其他图表中为Integers。因此,我的数据集的类型为<?扩展Number>。我究竟做错了什么?

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>))。

1 个答案:

答案 0 :(得分:3)

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

Ideone demo

如果您在通配符列表中添加额外的上限:

List<? extends Map<? extends Number,? extends Number>>
     ^-------^ here

那么您将无法将map添加到listX,因此这是安全的。