Code duplication caused by primitive types: How to avoid insanity?

前端 未结 8 452
温柔的废话
温柔的废话 2020-12-13 00:44

In one of my Java projects I am plagued by code repetition due to the way Java handles (not) primitives. After having to manually copy the same change to four different loca

8条回答
  •  庸人自扰
    2020-12-13 00:46

    Why are you hung up on primitives? The wrappers are extremely lightweight and auto-boxing and generics does the rest:

    public static > T max(T a, T b) {
        return a.compareTo(b) > 0 ? a : b;
    }
    

    This all compiles and runs correctly:

    public static void main(String[] args) {
        int i = max(1, 3);
        long l = max(6,7);
        float f = max(5f, 4f);
        double d = max(2d, 4d);
        byte b = max((byte)1, (byte)2);
        short s = max((short)1, (short)2);
    }
    

    Edited

    OP has asked about a generic, auto-boxed solution for sum(), and will here it is.

    public static  T sum(T... numbers) throws Exception {
        double total = 0;
        for (Number number : numbers) {
            total += number.doubleValue();
        }
        if (numbers[0] instanceof Float || numbers[0] instanceof Double) {
            return (T) numbers[0].getClass().getConstructor(String.class).newInstance(total + "");
        }
        return (T) numbers[0].getClass().getConstructor(String.class).newInstance((total + "").split("\\.")[0]);
    }
    

    It's a little lame, but not as lame as doing a large series of instanceof and delegating to a fully typed method. The instanceof is required because while all Numbers have a String constructor, Numbers other than Float and Double can only parse a whole number (no decimal point); although the total will be a whole number, we must remove the decimal point from the Double.toString() before sending it into the constructor for these other types.

提交回复
热议问题