public abstract class NumberMath extends Object
Stateless objects used to perform math on the various Number subclasses. Instances are required so that polymorphic calls work properly, but each subclass creates a singleton instance to minimize garbage. All methods must be thread-safe. The design goals of this class are as follows:
Type Params | Return Type | Name and description |
---|---|---|
|
public static Number |
abs(Number number) |
|
protected abstract Number |
absImpl(Number number) |
|
public static Number |
add(Number left, Number right) |
|
public abstract Number |
addImpl(Number left, Number right) |
|
public static Number |
and(Number left, Number right) |
|
protected Number |
andImpl(Number left, Number right) |
|
public static Number |
bitwiseNegate(Number left) |
|
protected Number |
bitwiseNegateImpl(Number left) |
|
public static int |
compareTo(Number left, Number right) |
|
public abstract int |
compareToImpl(Number left, Number right) |
|
protected UnsupportedOperationException |
createUnsupportedException(String operation, Number left) |
|
public static Number |
divide(Number left, Number right) |
|
public abstract Number |
divideImpl(Number left, Number right) |
|
public static NumberMath |
getMath(Number left, Number right) Determine which NumberMath instance to use, given the supplied operands. |
|
public static Number |
intdiv(Number left, Number right) |
|
protected Number |
intdivImpl(Number left, Number right) |
|
public static boolean |
isBigDecimal(Number number) |
|
public static boolean |
isBigInteger(Number number) |
|
public static boolean |
isByte(Number number) |
|
public static boolean |
isFloatingPoint(Number number) |
|
public static boolean |
isInteger(Number number) |
|
public static boolean |
isLong(Number number) |
|
public static boolean |
isShort(Number number) |
|
public static Number |
leftShift(Number left, Number right) For this operation, consider the operands independently. |
|
protected Number |
leftShiftImpl(Number left, Number right) |
|
public static Number |
mod(Number left, Number right) |
|
protected Number |
modImpl(Number left, Number right) |
|
public static Number |
multiply(Number left, Number right) |
|
public abstract Number |
multiplyImpl(Number left, Number right) |
|
public static Number |
or(Number left, Number right) |
|
protected Number |
orImpl(Number left, Number right) |
|
public static Number |
rightShift(Number left, Number right) For this operation, consider the operands independently. |
|
protected Number |
rightShiftImpl(Number left, Number right) |
|
public static Number |
rightShiftUnsigned(Number left, Number right) For this operation, consider the operands independently. |
|
protected Number |
rightShiftUnsignedImpl(Number left, Number right) |
|
public static Number |
subtract(Number left, Number right) |
|
public abstract Number |
subtractImpl(Number left, Number right) |
|
public static BigDecimal |
toBigDecimal(Number n) |
|
public static BigInteger |
toBigInteger(Number n) |
|
public static Number |
unaryMinus(Number left) |
|
protected abstract Number |
unaryMinusImpl(Number left) |
|
public static Number |
unaryPlus(Number left) |
|
protected abstract Number |
unaryPlusImpl(Number left) |
|
public static Number |
xor(Number left, Number right) |
|
protected Number |
xorImpl(Number left, Number right) |
Determine which NumberMath instance to use, given the supplied operands. This method implements the type promotion rules discussed in the documentation. Note that by the time this method is called, any Byte, Character or Short operands will have been promoted to Integer. For reference, here is the promotion matrix: bD bI D F L I bD bD bD D D bD bD bI bD bI D D bI bI D D D D D D D F D D D D D D L bD bI D D L L I bD bI D D L I Note that for division, if either operand isFloatingPoint, the result will be floating. Otherwise, the result is BigDecimal
For this operation, consider the operands independently. Throw an exception if the right operand (shift distance) is not an integral type. For the left operand (shift value) also require an integral type, but do NOT promote from Integer to Long. This is consistent with Java, and makes sense for the shift operators.
For this operation, consider the operands independently. Throw an exception if the right operand (shift distance) is not an integral type. For the left operand (shift value) also require an integral type, but do NOT promote from Integer to Long. This is consistent with Java, and makes sense for the shift operators.
For this operation, consider the operands independently. Throw an exception if the right operand (shift distance) is not an integral type. For the left operand (shift value) also require an integral type, but do NOT promote from Integer to Long. This is consistent with Java, and makes sense for the shift operators.