Is it possible to write a generic +1 method for numeric box types in Java?

后端 未结 7 2083
旧巷少年郎
旧巷少年郎 2021-01-18 15:56

This is NOT homework.

Part 1

Is it possible to write a generic method, something like this:



        
7条回答
  •  轮回少年
    2021-01-18 16:30

    Not the prettiest solution ever, but if you rely in the following properties of every known implementation of Number (in the JDK):

    • They can all be created from their String representation via a one-argument constructor
    • None of them has numbers that can't be represented by BigDecimal

    You can implement it using reflection and using Generics to avoid having to cast the result:

    public class Test {
    
        @SuppressWarnings("unchecked")
        public static  T plusOne(T num) {
            try {
                Class c = num.getClass();
                Constructor constr = c.getConstructor(String.class);
                BigDecimal b = new BigDecimal(num.toString());
                b = b.add(java.math.BigDecimal.ONE);
                return (T) constr.newInstance(b.toString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        public static void main(String[] args) {
            System.out.println(plusOne(1));
            System.out.println(plusOne(2.3));
            System.out.println(plusOne(2.4E+120));
            System.out.println(plusOne(2L));
            System.out.println(plusOne(4.5f));
            System.out.println(plusOne(new BigInteger("129481092470147019409174091790")));
            System.out.println(plusOne(new BigDecimal("12948109247014701940917.4091790")));
        }
    
    }
    

    The return is done using an apparently unsafe cast but given that you're using a constructor of the class of some T or child of T you can assure that it will always be a safe cast.

提交回复
热议问题