簡體   English   中英

java.lang.Long 不能轉換為 java.lang.Double

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

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