特定の状況下で、Firebase の Java API で驚くべき動作が見られます。java.lang.Long を処理しているときに、java.lang.Integer のインスタンスが返されます。JUnit テスト ケースの例を次に示します。
public class LongsTest extends TestCase {
public void testSetLong() throws Exception {
Firebase firebase = new Firebase("http://www.example.com");
firebase.addChildEventListener(new ChildEventListener() {
@Override public void onChildRemoved(DataSnapshot s) {}
@Override public void onChildMoved(DataSnapshot s, String p) {}
@Override public void onChildChanged(DataSnapshot s, String p) {}
@Override public void onChildAdded(DataSnapshot s, String p) {
Map<String, Object> map = s.getValue(new GenericTypeIndicator<Map<String,Object>>() {});
System.out.println(map.get("key").getClass());
}
@Override public void onCancelled() {}
});
Map<String, Object> map = new HashMap<String, Object>();
map.put("key", new Long(15));
firebase.child("foo").setValue(map);
Thread.sleep(1000);
}
}
このコードを実行すると、出力されclass java.lang.Integer
ます! の本体を次のように変更するため、Firebase は明らかに、コードのどこかに Long があることをまだ認識していますonChildAdded
。
Map<String,Object> map2 = (Map<String,Object>)s.getValue();
System.out.println(map2.get("key").getClass())
正しく印刷されclass java.lang.Long
ます。何が起きてる?