boxesruntime.java

来自「JAVA 语言的函数式编程扩展」· Java 代码 · 共 846 行 · 第 1/3 页

JAVA
846
字号
        }        if (maxcode <= DOUBLE) {            double val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).doubleValue();            double val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).doubleValue();            return boxToDouble(val1 + val2);        }        throw new NoSuchMethodException();    }    /** arg1 - arg2 */    public static Object subtract(Object arg1, Object arg2) throws NoSuchMethodException {        int code1 = typeCode(arg1);        int code2 = typeCode(arg2);        int maxcode = (code1 < code2) ? code2 : code1;        if (maxcode <= INT) {            int val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).intValue();            int val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).intValue();            return boxToInteger(val1 - val2);        }        if (maxcode <= LONG) {            long val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).longValue();            long val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).longValue();            return boxToLong(val1 - val2);        }        if (maxcode <= FLOAT) {            float val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).floatValue();            float val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).floatValue();            return boxToFloat(val1 - val2);        }        if (maxcode <= DOUBLE) {            double val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).doubleValue();            double val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).doubleValue();            return boxToDouble(val1 - val2);        }        throw new NoSuchMethodException();    }    /** arg1 * arg2 */    public static Object multiply(Object arg1, Object arg2) throws NoSuchMethodException {        int code1 = typeCode(arg1);        int code2 = typeCode(arg2);        int maxcode = (code1 < code2) ? code2 : code1;        if (maxcode <= INT) {            int val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).intValue();            int val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).intValue();            return boxToInteger(val1 * val2);        }        if (maxcode <= LONG) {            long val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).longValue();            long val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).longValue();            return boxToLong(val1 * val2);        }        if (maxcode <= FLOAT) {            float val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).floatValue();            float val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).floatValue();            return boxToFloat(val1 * val2);        }        if (maxcode <= DOUBLE) {            double val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).doubleValue();            double val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).doubleValue();            return boxToDouble(val1 * val2);        }        throw new NoSuchMethodException();    }    /** arg1 / arg2 */    public static Object divide(Object arg1, Object arg2) throws NoSuchMethodException {        int code1 = typeCode(arg1);        int code2 = typeCode(arg2);        int maxcode = (code1 < code2) ? code2 : code1;        if (maxcode <= INT) {            int val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).intValue();            int val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).intValue();            return boxToInteger(val1 / val2);        }        if (maxcode <= LONG) {            long val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).longValue();            long val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).longValue();            return boxToLong(val1 / val2);        }        if (maxcode <= FLOAT) {            float val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).floatValue();            float val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).floatValue();            return boxToFloat(val1 / val2);        }        if (maxcode <= DOUBLE) {            double val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).doubleValue();            double val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).doubleValue();            return boxToDouble(val1 / val2);        }        throw new NoSuchMethodException();    }    /** arg1 % arg2 */    public static Object takeModulo(Object arg1, Object arg2) throws NoSuchMethodException {        int code1 = typeCode(arg1);        int code2 = typeCode(arg2);        int maxcode = (code1 < code2) ? code2 : code1;        if (maxcode <= INT) {            int val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).intValue();            int val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).intValue();            return boxToInteger(val1 % val2);        }        if (maxcode <= LONG) {            long val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).longValue();            long val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).longValue();            return boxToLong(val1 % val2);        }        if (maxcode <= FLOAT) {            float val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).floatValue();            float val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).floatValue();            return boxToFloat(val1 % val2);        }        if (maxcode <= DOUBLE) {            double val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).doubleValue();            double val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).doubleValue();            return boxToDouble(val1 % val2);        }        throw new NoSuchMethodException();    }    /** arg1 >> arg2 */    public static Object shiftSignedRight(Object arg1, Object arg2) throws NoSuchMethodException {        int code1 = typeCode(arg1);        int code2 = typeCode(arg2);        if (code1 <= INT) {            int val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).intValue();            if (code2 <= INT) {                int val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).intValue();                return boxToInteger(val1 >> val2);            }            if (code2 <= LONG) {                long val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).longValue();                return boxToInteger(val1 >> val2);            }        }        if (code1 <= LONG) {            long val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).longValue();            if (code2 <= INT) {                int val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).intValue();                return boxToLong(val1 >> val2);            }            if (code2 <= LONG) {                long val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).longValue();                return boxToLong(val1 >> val2);            }        }        throw new NoSuchMethodException();    }    /** arg1 << arg2 */    public static Object shiftSignedLeft(Object arg1, Object arg2) throws NoSuchMethodException {        int code1 = typeCode(arg1);        int code2 = typeCode(arg2);        if (code1 <= INT) {            int val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).intValue();            if (code2 <= INT) {                int val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).intValue();                return boxToInteger(val1 << val2);            }            if (code2 <= LONG) {                long val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).longValue();                return boxToInteger(val1 << val2);            }        }        if (code1 <= LONG) {            long val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).longValue();            if (code2 <= INT) {                int val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).intValue();                return boxToLong(val1 << val2);            }            if (code2 <= LONG) {                long val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).longValue();                return boxToLong(val1 << val2);            }        }        throw new NoSuchMethodException();    }    /** arg1 >>> arg2 */    public static Object shiftLogicalRight(Object arg1, Object arg2) throws NoSuchMethodException {        int code1 = typeCode(arg1);        int code2 = typeCode(arg2);        if (code1 <= INT) {            int val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).intValue();            if (code2 <= INT) {                int val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).intValue();                return boxToInteger(val1 >>> val2);            }            if (code2 <= LONG) {                long val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).longValue();                return boxToInteger(val1 >>> val2);            }        }        if (code1 <= LONG) {            long val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).longValue();            if (code2 <= INT) {                int val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).intValue();                return boxToLong(val1 >>> val2);            }            if (code2 <= LONG) {                long val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).longValue();                return boxToLong(val1 >>> val2);            }        }        throw new NoSuchMethodException();    }            /** -arg */    public static Object negate(Object arg) throws NoSuchMethodException {        int code = typeCode(arg);        if (code <= INT) {            int val = (code == CHAR) ? ((Character) arg).charValue() : ((Number) arg).intValue();            return boxToInteger(-val);        }        if (code <= LONG) {            long val = (code == CHAR) ? ((Character) arg).charValue() : ((Number) arg).longValue();            return boxToLong(-val);        }        if (code <= FLOAT) {            float val = (code == CHAR) ? ((Character) arg).charValue() : ((Number) arg).floatValue();            return boxToFloat(-val);        }        if (code <= DOUBLE) {            double val = (code == CHAR) ? ((Character) arg).charValue() : ((Number) arg).doubleValue();            return boxToDouble(-val);        }        throw new NoSuchMethodException();    }            /** +arg */    public static Object positive(Object arg) throws NoSuchMethodException {        int code = typeCode(arg);        if (code <= INT) {            int val = (code == CHAR) ? ((Character) arg).charValue() : ((Number) arg).intValue();            return boxToInteger(+val);        }        if (code <= LONG) {            long val = (code == CHAR) ? ((Character) arg).charValue() : ((Number) arg).longValue();            return boxToLong(+val);        }        if (code <= FLOAT) {            float val = (code == CHAR) ? ((Character) arg).charValue() : ((Number) arg).floatValue();            return boxToFloat(+val);        }        if (code <= DOUBLE) {            double val = (code == CHAR) ? ((Character) arg).charValue() : ((Number) arg).doubleValue();            return boxToDouble(+val);        }        throw new NoSuchMethodException();    }    /** arg1 & arg2 */    public static Object takeAnd(Object arg1, Object arg2) throws NoSuchMethodException {        if ((arg1 instanceof Boolean) || (arg2 instanceof Boolean)) {            if (!((arg1 instanceof Boolean) && (arg2 instanceof Boolean))) {                throw new NoSuchMethodException();            }            return boxToBoolean(((Boolean) arg1).booleanValue() & ((Boolean) arg2).booleanValue());        }        int code1 = typeCode(arg1);        int code2 = typeCode(arg2);        int maxcode = (code1 < code2) ? code2 : code1;        if (maxcode <= INT) {            int val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).intValue();            int val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).intValue();            return boxToInteger(val1 & val2);        }        if (maxcode <= LONG) {            long val1 = (code1 == CHAR) ? ((Character) arg1).charValue() : ((Number) arg1).longValue();            long val2 = (code2 == CHAR) ? ((Character) arg2).charValue() : ((Number) arg2).longValue();            return boxToLong(val1 & val2);        }        throw new NoSuchMethodException();    }    /** arg1 | arg2 */    public static Object takeOr(Object arg1, Object arg2) throws NoSuchMethodException {        if ((arg1 instanceof Boolean) || (arg2 instanceof Boolean)) {            if (!((arg1 instanceof Boolean) && (arg2 instanceof Boolean))) {                throw new NoSuchMethodException();            }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?