Map 类型转换问题

具体情况是这样的:

我一个方法签名是这样的

 

public  void writeSheet(List<Map<String, Object>> data);

 

 

但是当我 传入一个 List<Map<String,String>> list 时,他却提示参数类型不符, 但是我 又添加一各方法时,却被提示方法已存在

public  void writeSheet(List<Map<String, String>> data);

 

 我想问下 ,Map中的类型没有 向上兼容的特性吗? 比如 Object通吃一切类型。

 

(1).数组是协变的,即如果Sub为Super的子类型,那么数组类型Sub[]就是Super[]的子类型;
泛型是不可变的,即对于任何两个不同类型Type1和Type2,List既不是List的子类型,也不是List的超类型。
Object[] objectArray = new Long[1];
objectArray[0] = “I don't fit in”;
上述代码在编译时没有错误,只有在运行时才会报ArrayStoreException。
List ol = new ArrayList();
ol.add(“I don’t fit in”);
上述代码的第一句就会在编译时报类型不兼容错误。

详见《Effective Java》

简单地说,Map不是Map的超类型

[code="java"]
有但不是你这样的
public void writeSheet(List> data);

public void writeSheet(List data);

你那是map里面是属性

一般传参数也是
List> 类型的
[/code]

方法签名一样,方法名 和方法参数一致,就会报错了。
重新定义一方法,方法名不一样不就行了。
既然是写入excel一般都是string类型,即使不是你在方法里面也得装换为string类型

有两种办法:

  1. 不要使用Map的类型MAP,都统一使用Map,这样一个声明就可以用了。

[code="java"]public void writeSheet(List> data);[/code]

  1. 如果你真的需要一个方法既可以传入List>又可以传入List>,那么就把方法声明成

[code="java"]public void writeSheet(List<? extends Map> data) [/code]

但是这个方法只能从data里面读取Map,不能往里面写Map。

还是建议你在使用Map的时候,统一使用Map,因为这个map也可以往里面放String,也可以放Object,读的时候,基本上都应该是字符串类型吧,或者还有其他的数字类型。

看了之前的4个回答,基本上都是偏的,没踩到题主的点上。还有采纳的答案,看上去说的也是对的,不过基本没回答什么东西。

题主一共有两个问题
1. 为什么参数表中List> 无法传入List>?
2. 为什么重载一个writeSheet(List> data)方法不能通过编译?

第一个问题正确的做法是方法的参数表设置为Map map,按照字面理解就是value的位置可以传入所有以Object作为父类的类,String就可以传了。采纳的答案这一点是对的,Map 和 Map是完全不同的两个类型。

第二个问题,对于重载来说,writeSheet(List> data) 和 writeSheet(List> data)是完全相同的方法。
可是参数的泛型不是不一样吗?错,参数真的是一模一样的,因为泛型的语法在javac编译后就会“擦除”。最后两者都变成writeSheet(List data),一样了当然不能通过编译了。

反正这个问题结贴了,我就再开一个回答好了。前面我的问题一的回答写太快,不谨慎,这里引以为戒。但是思路是不变的,这里重新回答楼主的问题。

参数表要定义成这样
[code="java"]List<? extends Map> map[/code]
才行。。。

首先Map不能继承自Map,但是可以继承自Map, (即value的位置可以传入所有以Object作为父类的类)。
同理,List 这一层,也必须使用同样的做法。总的来说,这样太蛋疼,还是要尽量在代码里避免这种写法。