Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法从地图中强制转换(<;字符串,对象>;映射<;字符串,列表<;地图<;字符串,字符串>&燃气轮机&燃气轮机;_Java_Generics_Casting - Fatal编程技术网

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中工作),但我不能真正更改接口,因为这是其他人的代码,需要时间。