Java 使用int调用setProperty,但getProperty在google app engine持久存储上返回Long
当将此代码与DatastoreService一起使用时,我得到的ClassCastException Long acnot在fromEntity中转换为整数。这是正常的行为吗?(我在本地计算机上使用google plugin for eclipse进行调试时会出现这种行为) 我是否总是必须像这样捕获此异常:Java 使用int调用setProperty,但getProperty在google app engine持久存储上返回Long,java,google-app-engine,entity,Java,Google App Engine,Entity,当将此代码与DatastoreService一起使用时,我得到的ClassCastException Long acnot在fromEntity中转换为整数。这是正常的行为吗?(我在本地计算机上使用google plugin for eclipse进行调试时会出现这种行为) 我是否总是必须像这样捕获此异常: try { ret._integerval = (Integer)ent.getProperty("property1"); } catch( ClassCastException
try
{
ret._integerval = (Integer)ent.getProperty("property1");
}
catch( ClassCastException ex ) {
Long val = (Long)ent.getProperty("property1");
ret._integerval = val.intValue();
}
或者可能所有的数值都存储得很长?我是否必须将_integervaltype更改为long以避免此异常?在强制转换时使用
int
而不是Integer
ret._integerval = (int)ent.getProperty("property1");
编辑:
API中包括以下内容
当值存储在数据存储中时,它将转换为
数据存储的本机类型。这可能包括加宽,例如转换
从短到长
因此,您的int数据正在转换为数据存储的本机类型,即
Long
。使用long
或long
强制转换创建新整数:
Integer property = new Integer(entity.getProperty("propertyKey").toString());
整数值保存为Long,因此app engine将始终返回Long,我自己也很困惑,但后来我看到如果您想在程序中使用
int
,那么这可以:
int i = (int) (long) entity.getProperty(propertyName);
仍然要确保数字进入整数范围(已讨论)。如
当值存储在数据存储中时,它将转换为
数据存储的本机类型。这可能包括加宽,例如转换
从短到长
所以
- 设置为int,但将其强制转换为long,因为出于某种原因,本地环境中的数据存储行为不同,并且它也存储整数
- 获取Long并使用.intValue()
同样的。Get java.lang.ClassCastException:java.lang.Long不能转换为java.lang.Integer。
int i = (int) (long) entity.getProperty(propertyName);
public int get() {
return ((Long) entity.getProperty(FIELD)).intValue();
}
public void set(int value) {
entity.setProperty(FIELD, (long)value);
}