9

我正在从 Java 访问一个从 Rails 应用程序写入的 MongoDB 实例。我正在检索应该存储在 Long 中的整数值,因为它们可以超过 32 位。

此代码将编译:

this.profile_uid  = (Long)this.profile.get("uid");

但是,我收到类型转换运行时错误:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

这可能是因为该字段由 Mongo 作为整数返回,但我知道某些 ID 可以作为 Longs 出现,并且由于各种原因,我无法更改写入数据库的类型(从另一个应用程序);在某些情况下它可能是 32 位,在其他情况下可能是 64 位。

Java 应用程序需要处理任何一个,我不想遇到某种截断或溢出问题。我想在 Java 方面将其作为 Long 来阅读。

我已经尝试了下面的解决方法,它似乎可以运行,但我不知道我是否可以通过这种方式避免截断或溢出问题。我不确定NumberJava中的类是做什么的。

this.profile_uid  = ((Number)this.profile.get("uid")).longValue();

这是合法的吗?它有什么副作用?还有其他/更好的方法吗?

4

2 回答 2

7

您建议的解决方法是合法的。Number是Java中所有数字类的超类。如果您的"uid"字段是数字格式,this.profile.get("uid"))则将返回一个对象,该对象是某个子类Number(因此强制转换Number将始终有效)。

的所有具体子类都Number必须实现该longValue()方法,因为它被定义为Number类中的抽象方法。

Integer.longValue()将其内部 int 值转换为 long。 Long.longValue()只需返回其内部 long 值。

于 2012-07-02T05:53:31.790 回答
1

有时不可能知道一个值是否是 Long 的整数。我编写了这个类来轻松检索 Long 值。

public class MongoDbHelper {
    public static Long getLongValue(Document doc, String key, Long defaultVal) {
        Object obj = doc.get(key);
        if (obj == null) {
            return defaultVal;
        } else if (obj instanceof Integer) {
            return ((Integer) obj).longValue();
        } else if (obj instanceof Long) {
            return (Long)obj;
        } else {
            throw new ClassCastException("Could not convert " + obj.getClass() + " to Long");
        }
    }
}
于 2018-05-14T15:45:41.347 回答