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 上使用 <<
运算符,它可以是 Integer 或 BigInteger.
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
不过还是有点烦人...
如何对 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 上使用 <<
运算符,它可以是 Integer 或 BigInteger.
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
不过还是有点烦人...