簡體   English   中英

Java:通用方法和數字

[英]Java: Generic methods and numbers

我想制作一個通用方法,它可以得到一個數字List的總和。

我在想的是這個:

public static <T extends Number> T sumList(List<T> data)
{
    T total = 0;
    for (T elem : data)
    {
        total += elem;
    }
    return total;
}

但問題是there is no += operator in T並且total can't be assigned to zero

我怎樣才能做到這一點?

謝謝

有一些方法你可以一起破解這個,但老實說,仿制葯根本不是去這里的方式。 為每個具體的原始包裝類型構建一個方法並分別實現它們。 使它成為通用的將是一件令人頭疼的問題; 算術運算一般不會發生。

通過使它成為通用的,你也沒有真正獲得任何東西。 它是如此簡單和常量的代碼,您不必擔心代碼重復,因為它不會改變。 人們不會將自己的數字類型傳遞給您的代碼; 它適用的類型域已經很好地定義和有限。

我最近已經完成了(基於lambdaj代碼),請注意它需要所有元素都是相同的類型(你不能真正添加​​一個Byte和一個BigDecimal )並且如果不是這樣的話可以拋出一個CCE不會處理自定義Number

public class SumAggregator<T extends Number> {
    public T aggregate(Iterable<T> iterable) {
        T result = null;
        for (T item : iterable) {
            result = aggregate(result, item);
        }
        return result;
    }


    @SuppressWarnings("unchecked")
    protected T aggregate(T first, T second) {
        if (first == null) {
            return second;
        } else if (second == null) {
            return first;
        } else if (first instanceof BigDecimal) {
            return (T) aggregate((BigDecimal) first, (BigDecimal) second);
        } else if (second instanceof BigInteger) {
            return (T) aggregate((BigInteger) first, (BigInteger) second);
        } else if (first instanceof Byte) {
            return (T) aggregate((Byte) first, (Byte) second);
        } else if (first instanceof Double) {
            return (T) aggregate((Double) first, (Double) second);
        } else if (first instanceof Float) {
            return (T) aggregate((Float) first, (Float) second);
        } else if (first instanceof Integer) {
            return (T) aggregate((Integer) first, (Integer) second);
        } else if (first instanceof Long) {
            return (T) aggregate((Long) first, (Long) second);
        } else if (first instanceof Short) {
            return (T) aggregate((Short) first, (Short) second);
        } else {
            throw new UnsupportedOperationException("SumAggregator only supports official subclasses of Number");
        }
    }

    private BigDecimal aggregate(BigDecimal first, BigDecimal second) {
        return first.add(second);
    }

    private BigInteger aggregate(BigInteger first, BigInteger second) {
        return first.add(second);
    }

    private Byte aggregate(Byte first, Byte second) {
        return (byte) (first + second);
    }

    private Double aggregate(Double first, Double second) {
        return first + second;
    }

    private Float aggregate(Float first, Float second) {
        return first + second;
    }

    private Integer aggregate(Integer first, Integer second) {
        return first + second;
    }

    private Long aggregate(Long first, Long second) {
        return first + second;
    }

    private Short aggregate(Short first, Short second) {
        return (short) (first + second);
    }
}

此代碼使用示例在ideone上執行

看看以下用於求和任何Number類型變量列表的泛型方法示例......我確信這就是你要求的......

Mark Peters的答案也是對的,但這也是一個可行的解決方案。

public class GenericSum {
@SuppressWarnings("unchecked")
public static <E> E sumArray(E[] inputArray) {
    Double result = 0.0;
    // Sum array elements
    for (E element : inputArray) {
        result = ((Number) result).doubleValue()
                + ((Number) element).doubleValue();
    }
    return ((E) result);
}

public static void main(String args[]) {
    // Create arrays of Integer, Double
    Integer[] intArray = { 1, 2, 3, 4, 5 };
    Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };

    System.out.println("Sum of doubles : " + sumArray(intArray));
    System.out.println("Sum of doubles : " + sumArray(doubleArray));
}

}

您可以使用庫,例如Generic Java Math (其編號部分),它為Number子類提供通用操作。 它提供了一種通常使用數字的方法,就像在您的示例中一樣,但是通過傳遞Arithmetics對象,可以進行實際計算。 請參閱主頁上的示例。
它必須使用盒裝類型,因此如果您需要速度,在Java中沒有通用實現可以做到這一點,您必須使用原始類型。

暫無
暫無

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

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