簡體   English   中英

在Java中從MongoDB讀取Integer字段時出現長類型轉換錯誤

[英]Long type cast error when reading Integer field from MongoDB in Java

我正從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將字段作為Integer返回,但是我知道一些ID可以作為Longs出現,並且由於各種原因我無法更改寫入DB的類型(來自另一個應用程序); 在某些情況下它可能是32位而在其他情況下可能是64位。

Java應用程序需要處理任何一個,我不想遇到某種截斷或溢出問題。 我想在Java端將其讀作Long。

我已經嘗試了下面的解決方法,它似乎運行,但我不知道我是否可以通過這種方式避免截斷或溢出問題。 我不確定Java中的Number類是做什么的。

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

這是合法的嗎? 它有什么副作用? 還有其他/更好的方法嗎?

您建議的解決方法是合法的。 Number是Java中所有數字類的超類。 如果您的"uid"字段是數字格式,則this.profile.get("uid"))將返回一個對象,該對象是Number某個子類(因此轉換為Number將始終有效)。

Number所有具體子類都必須實現longValue()方法,因為它被定義為Number類中的抽象方法。

Integer.longValue()將其內部int值轉換為long。 Long.longValue()只返回其內部long值。

有時候不可能知道一個值是否是一個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");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM