[英]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.