在某些情况下,我看到 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
。这里发生了什么?