簡體   English   中英

如何多態使用java.lang.Number

[英]How to use java.lang.Number polymorphically

我正在嘗試多態使用java.lang.Number:我有一個List,在其中放置了多個Double,Integer等實例,然后我想對它們進行多態算術運算(例如,對每個Number加倍)。

我們沒有使用java.lang.Number進行自動裝箱的功能,並且在示例源代碼中沒有-不是那么多態-方法multiple(Number n,int factor)的情況下,我也沒有想出更好的方法來做到這一點隨后...通過這種實現,我們將需要一個用於每個算術運算(加,減等)的方法。


編輯-增強問題:如果從抽象的角度考慮java.lang.Number,我們會認為任何Number都可以算術運算的一部分,但它似乎並不存在簡單的加/減/方法。將x乘以/ etc到Number列表,而與數字的類型無關(Integer,Double,Short ...)


還有更好的想法嗎? 提前致謝 ;)

示例源代碼:

public class NumberTest {

    private List<Number> list = new ArrayList<Number>();    

    public static void main(String args[]) {
        new NumberTest().start();

    }

    protected void start() {
        this.fillList();
        Number num;
        for (int i = 0; i < list.size(); i++) {
            num = this.multiply(list.get(i), 2);
            list.set(i, num);
        }

        System.out.println(this.toString());
    }

    private void fillList() {
        list.add(new Byte((byte) 12));
        list.add(new Short((short) 20));
        list.add(new Integer(30));
        list.add(new Long(40));
        list.add(new Float(50.123));
        list.add(new Double(60.123));
    }

    private Number multiply(Number n, int factor) {
        if (n instanceof Byte) {
            n = n.byteValue() * factor;
        } else if (n instanceof Short) {
            n = n.shortValue() * factor;
        } else if (n instanceof Integer) {
            n = n.intValue() * factor;
        } else if (n instanceof Long) {
            n = n.longValue() * factor;
        } else if (n instanceof Float) {
            n = n.floatValue() * factor;
        } else if (n instanceof Double) {
            n = n.doubleValue() * factor;
        }
        return n;
    }

    @Override
    public String toString() {
        String result = "";
        for (Number num : list) {
            result += num+"\n";
        }
        return result;
    }

我真的不明白為什么不能使用Number.doubleValue()進行數學運算。 我想念什么?

例如

public Double multiply(Number n, double factor) {
   return new Double(n.getDoubleValue() * factor);
}

編輯已添加:

@amano已澄清,他想更改現有List中的Objects,同時保持其原始類型 我想我的第一個問題是,“為什么”? 他的示例使用Byte 大多數東西乘一個字節乘以通常會導致溢出。 Integer添加double精度將失去精度。 Byte減去integer並將結果強制返回Byte通常會給出錯誤的結果。 將整數除以整數通常會失去精度(例如3/2 = 1,而不是1.5)。 除非您需要絕對完美的精度(例如,為了錢),否則數學上最正確的解決方案是始終轉換為雙精度並保持結果為雙精度。 是的,會有一些較小的舍入錯誤,但是沒有什么比3/2 = 1或(字節)23-665544 =誰知道字節是什么?

您為什么還要關心該值最初是一個字節? 當您想將其視為數字時,有什么大不了的? 數字輸入,數字(技術上為雙精度)輸出。

所以我理解得更好,但我仍然缺少一些東西。 值保持原始類型的約束會導致不准確,並增加了很多工作。 如果您堅持這種約束,是的,您將不得不做很多instanceof

鏡像Number類的層次結構:編寫自己的NumberWrapper類,並為每個基元編寫一個知道實際類型並可以執行適當操作的專門類。

深夜編輯:當然,您始終可以只使用Number#doubleValue()並僅使用雙打進行處理...

我同意塔索斯的看法,除了寫所有這些聽起來很乏味...

您可以嘗試使用類似以下內容的方法,而不是重新發明輪子: http : //code.google.com/p/generic-java-math/ 我自己從未使用過此庫,但看起來像您需要的。

暫無
暫無

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

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