Groovy 中 BigInteger 的 leftShift 方法

leftShift method on BigInteger in Groovy

如何对 Groovy 中的 BigInteger 执行 leftShift 操作?

leftShift方法在Groovy's JDK enhancement

中定义

但是,下面的代码抛出一个 UnsupportedOperationException 异常:

Integer i = new Integer(3)
println(i << 2)

BigInteger b = new BigInteger("3")
println(b << 2)

结果:

12   <-- working for Integer
Caught: java.lang.UnsupportedOperationException: Cannot use leftShift() on this number type: java.math.BigInteger with value: 3
java.lang.UnsupportedOperationException: Cannot use leftShift() on this number type: java.math.BigInteger with value: 3
        at test.run(test.groovy:5)

我想我可以使用 BigInteger.shiftLeft() 方法(注意它不是 leftShift 而是 shiftLeft...),但是最后,我想在 Number 上使用 << 运算符,它可以是 IntegerBigInteger.

Groovy 中的错误? (我使用的是 3.0.4)

无论出于何种原因,底层 BigIntegerMath does not override the leftShiftImpl() 方法都会导致 UnsopportedOperationException.

可能值得提出一个问题。

现在您必须求助于

等解决方法
assert 12 == new BigInteger(3).intValue() << 2
//or
assert 12 == new BigInteger(3).shiftLeft( 2 )

所以,这似乎是 Groovy 中的一个错误,正如我们@injecteer

所指出的

好消息是 Groovy 很容易用 class “mixin”“修复”:

class EnhancedNumber {

    static def originalLeftShift = org.codehaus.groovy.runtime.DefaultGroovyMethods.&leftShift
    static Number leftShift(Number self, Number operand) {
        self.class == BigInteger ? self.shiftLeft(operand) : originalLeftShift(self, operand)
    }
}

Number.mixin(EnhancedNumber)

Integer i = new Integer(3)
assert 12 == i << 2

Number b = new BigInteger("3")
assert 12 == b << 2

不过还是有点烦人...