![](/img/trans.png)
[英]MongoDB: class java.lang.Double cannot be cast to class java.lang.Long
[英]java.lang.Long cannot be cast to java.lang.Double
我有一個將對象作為輸入的方法,如果輸入是 instanceOF Long,則將值轉換為雙精度值。 下面是代碼:
public static void main(String[] args) {
Long longInstance = new Long(15);
Object value = longInstance;
convertDouble(value);
}
static double convertDouble(Object longValue){
double valueTwo = (double)longValue;
System.out.println(valueTwo);
return valueTwo;
}
但是當我執行上面的代碼時,我遇到了以下異常:
Exception in thread "main" java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
at com.datatypes.LongTest.convertDouble(LongTest.java:12)
at com.datatypes.LongTest.main(LongTest.java:8)
請讓我知道為什么它給我例外。
但是如果直接嘗試將 Long 對象轉換為 double 則不會出現 classCast 異常。
Long longInstance = new Long(15);
double valueOne = (double)longInstance;
System.out.println(valueOne);
這令人困惑。
在 JLS 中找到解釋, https: //docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.5
在表 5.1 下。 將轉換轉換為原始類型
Long l = new Long(15);
Object o = l;
將 Object Type 轉換為原始類型時,它將縮小然后拆箱。
double d1=(double)o;
在上面的語句中,我們試圖將Object 縮小為 Double ,但由於實際值是 Long所以在運行時它會根據5.1.6 中定義的縮小轉換規則拋出ClassCastException 。 縮小參考轉換
將 Long Type 轉換為 double 時,會先拆箱,然后加寬。
double d2 =(double)l;
它將首先通過調用 longvalue() 方法對 Long 值進行拆箱,然后進行從 long 到 double 的擴展,這可以沒有錯誤。
如果您不確定對象是什么數字類型,那么我建議使用以下代碼片段:
double d = 0.0;
if (obj instanceof Number) {
d = ((Number) obj).doubleValue();
}
首先檢查Object是否為instanceof Long,然后調用Long對象的valueOf
片段:
static double convertDouble(Object longValue){
double valueTwo = -1; // whatever to state invalid!
if(longValue instanceof Long)
valueTwo = ((Long) longValue).doubleValue();
System.out.println(valueTwo);
return valueTwo;
}
您嘗試將 Object 轉換為 double,因為您的 convertDouble 參數是 Type 對象。 因此,自動拆箱將不起作用。 將有兩種解決方案:首先,將 Object 強制轉換為 Long(使用 instanceof 檢查)其次,使用 Long 作為參數
public static void main(String[] args) {
Long longInstance = new Long(15);
Object value = longInstance;
convertDouble(value);
}
static double convertDouble(Long longValue){
double valueTwo = (double)longValue;
System.out.println(valueTwo);
return valueTwo;
}
如果你想使用 convertDouble 方法轉換不同類型的參數,你可以檢查 instanceof 然后將 Object 轉換為類型,你最終有
這種方法不是很高效,但可以將任何 Number 對象轉換為常見的 java.lang 對象(Byte、Short、Integer、Long、Float 和 Double)。
這使用反射來調用 Number 類的方法(shotValue()、intValue() 等)。
不幸的是,不存在 integerValue 方法名稱,因此我使用替換字符串將整數轉換為 int。
我希望有幫助。
public <T extends Number> T cast(Number value, Class<T> toClass) {
try {
String methodName = toClass.getSimpleName().toLowerCase().replace("integer", "int") + "Value";
Method m = Number.class.getMethod(methodName);
return (T) m.invoke(value);
} catch (Exception ex) {
}
return null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.