簡體   English   中英

Groovy 中 BigInteger 的 leftShift 方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM