[英]leftShift method on BigInteger in Groovy
如何對Groovy中的BigInteger執行leftShift操作?
leftShift方法是在Groovy 的 JDK 增強中定義的
但是,下面的代碼會引發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或大整數。
Groovy 中的錯誤? (我使用的是 3.0.4)
無論出於何種原因,底層BigIntegerMath
都不會覆蓋leftShiftImpl()方法,這會導致UnsopportedOperationException
。
可能值得提出問題。
現在,您必須求助於解決方法,例如
assert 12 == new BigInteger(3).intValue() << 2
//or
assert 12 == new BigInteger(3).shiftLeft( 2 )
因此,正如@injecteer 指出的那樣,這似乎是 Groovy 中的一個錯誤
好消息是 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
不過還是有點煩。。。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.