簡體   English   中英

克服Java中的類型擦除

[英]Overcome type erasure in Java

我有一個不能更改的客戶班。

List<Integer> list1= Arrays.asList(1,2,3);
System.out.println("Total sum is:"+sum(list1));
printlist(list1);
List<Double> list2=Arrays.asList(1.0,2.0,3.0);
System.out.println("Total sum is:"+sum(list2));
printlist(list2);

我這里有業務邏輯

private static Object sum(List<? extends Number> list) {
    double sum = 0;
    for (Number i: list) {
        sum+=i.doubleValue();
    }     
    return sum;
}

所以我想為整數返回6,為雙精度返回6.0。 我怎樣才能做到這一點? 我想根據類型將求和類型轉換為int或double,但是由於類型擦除,所有信息都丟失了。 有人能幫我嗎?

列表中的對象在運行時仍具有與它們關聯的類型信息。 唯一擦除的類型是泛型的類型(即示例中的List )。 泛型在編譯時檢查,但不保留在生成的字節碼中。 這意味着您可以使用instanceof檢查集合的內容

private static Object sum(List<? extends Number> list) {
    Integer integerSum = 0;
    Double doubleSum = 0.0;
    boolean hasDouble = false;
    for (Number i: list) {
        if (i instanceof Integer) {
            integerSum += i.intValue();
        } else {
            doubleSum += i.doubleValue();
            hasDouble = true;
        }
    }
    if (hasDouble)
        return doubleSum + integerSum;
    return integerSum;
}

該代碼具有處理混合列表的一些特性,並且不能正確處理LongShortByte等。

使用“ instanceof”

     if( i instanceof Double) {
       System.out.println("param is a Double");
     }
     else if( i instanceof Integer) {
       System.out.println("param is an Integer");
    }

假設Number子類實例可以用double表示是危險的。 為了安全地執行此操作,您需要檢查所有可能的類型。

@SuppressWarnings("unchecked")
private static <T extends Number> T sum(List<T> list) {
    Objects.requireNonNull(list);

    if (list.isEmpty() || list.contains(null))
        throw new IllegalArgumentException();

    Class<T> clazz = (Class<T>) list.get(0).getClass();

    if (clazz == Integer.class) {
        return (T) (Integer) list.stream().mapToInt(i -> (Integer) i).sum();
    }
    else if (clazz == Double.class) {
        return (T) (Double) list.stream().mapToDouble(i -> (Double) i).sum();
    }
    /* And other Number subclass types */

    // Not possible if all types covered
    throw new IllegalStateException();
}

是與此相關的問題/答案。

暫無
暫無

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

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