在DatastoreService中使用此代码时,我得到ClassCastException Long无法在fromEntity中强制转换为整数。这是正常的行为吗? (我在本地计算机上使用google插件进行eclipse调试时会出现这种情况)
class UserData {
private int _integerval = 0;
private String _stringval = "";
public Entity getEntity() {
Entity ret = new Entity( "User", key );
ret.setProperty( "property1", _integerval );
ret.setProperty( "property2", _stringval );
return ret;
}
public static UserData fromEntity( Entity ent ) {
UserData ret = new UserData();
ret._integerval = (Integer)ent.getProperty("property1");
ret._stringval = (String)ent.getProperty("property2");
return ret;
}
}
我是否总是必须像这样抓住这个例外:
try
{
ret._integerval = (Integer)ent.getProperty("property1");
}
catch( ClassCastException ex ) {
Long val = (Long)ent.getProperty("property1");
ret._integerval = val.intValue();
}
或许所有数值都只存储了很长时间?我是否必须将_integerval类型更改为long以避免此异常?
答案 0 :(得分:6)
创建一个新的整数:
Integer property = new Integer(entity.getProperty("propertyKey").toString());
答案 1 :(得分:5)
在投射时使用int
代替Integer
。
ret._integerval = (int)ent.getProperty("property1");
修改强>
以下内容包含在setProperty API中。
当值存储在数据存储区中时,它将转换为 数据存储区的本机类型。这可能包括扩大,例如转换 短暂的。
因此,您的 int 数据正在转换为数据存储区的本机类型Long
。使用long
或Long
进行投射。
答案 2 :(得分:1)
如果您想在程序中使用int
,那么这样就可以了:
int i = (int) (long) entity.getProperty(propertyName);
仍然可以确保该数字进入了int范围(讨论here)。
答案 3 :(得分:1)
当值存储在数据存储区中时,它将转换为 数据存储区的本机类型。这可能包括扩大,例如转换 短暂的。
所以
获取Long并使用.intValue()
public int get() {
return ((Long) entity.getProperty(FIELD)).intValue();
}
public void set(int value) {
entity.setProperty(FIELD, (long)value);
}
答案 4 :(得分:0)
整数值保存为Long,因此app引擎将始终返回Long,我很困惑,但后来我看到了this