2016-05-26 8 views
0

をハッシュマップ返す見ての通り、私はMap<String, String>として戻り値の型を指定するDAOコードMyBatisのは、ここでは実数型

@Select("select * from my_table order by id limit 1") 
Map<String, String> selectFirst(); 

です。そして今、混乱が来る:

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<String, String>からIntegerを取得しますか?
Daoメソッドの実際の戻り値の型がMap<String, Object>の場合、Map<String, String>にどのように割り当てることができますか?

+0

Genericsは純粋なコンパイル時の概念です。実行時にjavaは型消去と呼ばれるものを使用します。したがって、Map を定義していても、実行時javaはそれを純粋なMapオブジェクトとして認識します。ジェネリックスがどのように機能するかを詳しく読んだら、事柄はより明確になるだろう。 –

+0

@VishalKamat Javaジェネリックスにはいくつかの制限があることを理解している。しかし型の消去はMyBatisが私にDaoメソッドから 'Map 'を返すことを間違って許してしまう言い訳ではありません。 – duleshi

答えて

0

あなたのDAOはuntyped mapを返します。これはMap<Object, Object>と同じです。型付きマップに割り当てることができます。しかし、コレクション要素で操作する場合、指定された型に要素をキャストしようとします。キャストが不可能な場合は例外をスローします。

 // 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<Object, Object>タイプを使用するか、この場合Map<String, Object>でOKになります。

 // untyped map 
     Map objectMap = new HashMap(); 
     objectMap.put("key", new Integer(12)); 
     // assign 
     Map<String, Object> stringMap = objectMap; 
     System.out.print(stringMap.get("key")); 
+0

MyBatisがタイプされていないマップを返すという証拠はありますか? MyBatisのソースコードに関する説明を高く評価します。 – duleshi

関連する問題