Java 无法从地图中强制转换(<;字符串,对象>;映射<;字符串,列表<;地图<;字符串,字符串>&燃气轮机&燃气轮机;
我正在升级以下代码:Java 无法从地图中强制转换(<;字符串,对象>;映射<;字符串,列表<;地图<;字符串,字符串>&燃气轮机&燃气轮机;,java,generics,casting,Java,Generics,Casting,我正在升级以下代码: return this.getMethod().execute(mp); 如果execute方法具有签名: public Map<String,Object> execute(Object mp) 公共映射执行(对象mp) 我有一些代码期望方法的返回是Map,但是编译器在转换时遇到了瓶颈。那么,我可以/如何让这个角色正确施放?Java 5和6之间是否有任何变化会使这成为编译时问题?只要您确定返回的映射将只包含List类型的值,那么您需要使用双转换: Map
return this.getMethod().execute(mp);
如果execute方法具有签名:
public Map<String,Object> execute(Object mp)
公共映射执行(对象mp)
我有一些代码期望方法的返回是Map
,但是编译器在转换时遇到了瓶颈。那么,我可以/如何让这个角色正确施放?Java 5和6之间是否有任何变化会使这成为编译时问题?只要您确定返回的映射将只包含List
类型的值,那么您需要使用双转换:
Map<String, Object> map = this.getMethod().execute(mp);
@SuppressWarnings("unchecked") //thoroughly explain why it's okay here
Map<String, List<Map<String, String>>> mapWithNarrowedTypes =
(Map<String, List<Map<String, String>>>)(Map<?, ?>)map;
return mapWithNarrowedTypes;
Map Map=this.getMethod().execute(mp);
@SuppressWarnings(“unchecked”)//彻底解释为什么这里没有问题
使用窄类型映射地图=
(地图)(地图)地图;
返回带有窄类型的映射;
对于这类问题,我经常发现以下构造很有用:
public final class Reinterpret {
@SuppressWarnings("unchecked")
public static <T> T cast(Object object) {
return (T)object;
}
}
公共最终类重新解释{
@抑制警告(“未选中”)
公共静态T转换(对象){
返回(T)对象;
}
}
您可以使用,例如,如下所示:
...
public void process(Map<String, Object> data) {
// method can properly handle any Object value,
// including String
}
...
Map<String, String> stringData = ...
process(Reinterpret.<Map<String, Object>>cast(stringData));
...
。。。
公共作废流程(地图数据){
//方法可以正确处理任何对象值,
//包括字符串
}
...
映射字符串数据=。。。
过程(重新解释.cast(stringData));
...
正如您所猜测的,Java泛型类型系统的非常精确的弱化是受C++的reinterpret_cast操作符启发的,并且适用于类似的上下文;但是,它也可以用于其他一些情况,例如,当您希望减少强制类型转换的详细程度时,例如
Map<String, Object> objectMap = Reinterpret.cast(stringMap);
Map objectMap=Reinterpret.cast(stringMap);
Java6的类型推断足够强(或足够弱,取决于您的视角),可以将右侧表达式转换为左侧所需的表达式;但是,请注意,这对于赋值很好,但对于函数调用则不行,这就是上面的示例要求在调用本身中完全指定参数类型的原因。您能澄清“介于5和6之间”的含义吗?我想他指的是java版本您能保证映射的值仅为
List
?为什么有人使用泛型,然后将Object
作为值类型?我可以保证(这段代码现在在prod中工作),但我不能真正更改接口,因为这是其他人的代码,需要时间。