我开始测试Tomcat 7并发现了我在Tomcat 5中没有遇到的强制转换错误。两个版本的Tomcat都使用与Java 6相同的路径。
这是来自JSP的调用:
ImcKaView entityBrowser=new ImcKaView();
entityBrowser.setParam(request.getParameterMap(),true);
这是被调用的方法:
public void setParam(Map<String,Object> m,boolean convertCollection){/* set param code */}
以下是施法错误:
ImcKa类型中的方法setParam(Map<String,Object>, boolean)
不适用于参数(Map<String,String[]>, boolean)
我不应该将Map<String,String[]>
传递给Map<String,Object>
吗?
在回答后更新Tomcat相关部分:
我对所选答案非常满意,因为我明确提到了String []到Object的强制转换问题。
对于那些来到这里仍然感到困惑的人来说,只有在切换Tomcat版本时才会出现此问题,request.getParameterMap()
的定义并未在较旧的Tomcat中输入:
Tomcat 5.5:
public java.util.Map getParameterMap()
Tomcat 7.0:
public java.util.Map<java.lang.String,java.lang.String[]> getParameterMap()
答案 0 :(得分:0)
不,你不能将Map<String,String[]>
传递给Map<String,Object>
(类型不一样)。在这里你需要使用通配符
public void setParam(Map<String, ? extends Object> m, boolean convertCollection){
..
}
Here是对wildcards
和bounded wildcards
的良好解释。
答案 1 :(得分:0)
Java中的泛型不是协变的。这意味着Map<String,String[]>
不是Map<String,Object>
的子类型。类型参数(String[]
是-a Object
)之间的关系不会使泛型类型(Map<String,String[]>
和Map<String,Object>
)相关。