Java MyBatis返回hashmap实型

Java MyBatis返回hashmap实型,java,orm,mybatis,Java,Orm,Mybatis,这是Dao代码 @Select("select * from my_table order by id limit 1") Map<String, String> selectFirst(); @Select(“按id限制1从我的表格中选择*) Map selectFirst(); 如您所见,我将返回类型指定为Map。现在出现了困惑: Map<String, String> firstRow = myDao.selectFirst(); Object o = firs

这是Dao代码

@Select("select * from my_table order by id limit 1")
Map<String, String> selectFirst();
@Select(“按id限制1从我的表格中选择*)
Map selectFirst();
如您所见,我将返回类型指定为
Map
。现在出现了困惑:

Map<String, String> firstRow = myDao.selectFirst();
Object o = firstRow.get("id");
System.out.println(o.getClass()); // class java.lang.Integer
// java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
int id = Integer.parseInt(firstRow.get("id"));
Map firstRow=myDao.selectFirst();
对象o=firstRow.get(“id”);
System.out.println(o.getClass());//类java.lang.Integer
//java.lang.ClassCastException:java.lang.Integer不能转换为java.lang.String
intid=Integer.parseInt(firstRow.get(“id”));
所以我从一个
映射中得到一个
整数
,这怎么可能发生呢?

如果Dao方法的实际返回类型是
Map
,如何将其分配给
Map

DAO返回
非类型映射
,与
映射
相同。可以将其分配给键入的映射。但当您使用集合元素进行操作时,它将尝试将元素强制转换为指定的类型,如果无法强制转换,它将引发异常

        // untyped map
        Map objectMap = new HashMap();
        objectMap.put("key", new Integer(12));
        // assign
        Map<String, String> stringMap = objectMap;
        // java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
        System.out.print(stringMap.get("key"));
//非类型化映射
Map objectMap=newhashmap();
put(“key”,新的整数(12));
//分配
Map stringMap=objectMap;
//java.lang.ClassCastException:java.lang.Integer不能转换为java.lang.String
System.out.print(stringMap.get(“key”);
解决方案:使用
Map
类型或在这种情况下
Map
即可

        // untyped map
        Map objectMap = new HashMap();
        objectMap.put("key", new Integer(12));
        // assign
        Map<String, Object> stringMap = objectMap;
        System.out.print(stringMap.get("key"));
//非类型化映射
Map objectMap=newhashmap();
put(“key”,新的整数(12));
//分配
Map stringMap=objectMap;
System.out.print(stringMap.get(“key”);

您的DAO返回
非类型映射
,它与
映射
相同。可以将其分配给键入的映射。但当您使用集合元素进行操作时,它将尝试将元素强制转换为指定的类型,如果无法强制转换,它将引发异常

        // untyped map
        Map objectMap = new HashMap();
        objectMap.put("key", new Integer(12));
        // assign
        Map<String, String> stringMap = objectMap;
        // java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
        System.out.print(stringMap.get("key"));
//非类型化映射
Map objectMap=newhashmap();
put(“key”,新的整数(12));
//分配
Map stringMap=objectMap;
//java.lang.ClassCastException:java.lang.Integer不能转换为java.lang.String
System.out.print(stringMap.get(“key”);
解决方案:使用
Map
类型或在这种情况下
Map
即可

        // untyped map
        Map objectMap = new HashMap();
        objectMap.put("key", new Integer(12));
        // assign
        Map<String, Object> stringMap = objectMap;
        System.out.print(stringMap.get("key"));
//非类型化映射
Map objectMap=newhashmap();
put(“key”,新的整数(12));
//分配
Map stringMap=objectMap;
System.out.print(stringMap.get(“key”);

泛型是纯编译时概念。在运行时,java使用一种称为类型擦除的方法。所以,即使您已经定义了映射,在运行时java也将其视为一个纯映射对象。如果你详细阅读泛型是如何工作的,事情会更复杂clear@VishalKamat我确实理解java泛型有一些局限性。但是类型擦除并不是MyBatis错误地允许我从Dao方法返回
Map
的借口。泛型是纯编译时概念。在运行时,java使用一种称为类型擦除的方法。所以,即使您已经定义了映射,在运行时java也将其视为一个纯映射对象。如果你详细阅读泛型是如何工作的,事情会更复杂clear@VishalKamat我确实理解java泛型有一些局限性。但是类型擦除并不是MyBatis错误地允许我从Dao方法返回
映射的借口。你有证据证明MyBatis返回的是非类型映射吗?非常感谢您对MyBatis源代码的解释。您有任何证据证明MyBatis返回非类型映射吗?非常感谢您对MyBatis源代码的解释。