Java Groovy中biginger的leftShift方法

Java Groovy中biginger的leftShift方法,java,groovy,biginteger,Java,Groovy,Biginteger,如何在Groovy中对BigInteger执行leftShift操作 leftShift方法在中定义 但是,以下代码引发UnsupportedOperationException异常: Integer i = new Integer(3) println(i << 2) BigInteger b = new BigInteger("3") println(b << 2) Integer i=新整数(3) println(i无论出于何种原因,底层都不

如何在Groovy中对BigInteger执行leftShift操作

leftShift方法在中定义

但是,以下代码引发UnsupportedOperationException异常:

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

BigInteger b = new BigInteger("3")
println(b << 2)
Integer i=新整数(3)

println(i无论出于何种原因,底层都不会重写该方法,这将导致
unsoupportedoperationexception

可能值得提出一个问题

现在你必须求助于像这样的变通办法

assert 12 == new BigInteger(3).intValue() << 2
//or
assert 12 == new BigInteger(3).shiftLeft( 2 )

assert 12==new BigInteger(3).intValue()无论出于何种原因,底层都不会重写该方法,这将导致
unsouportedOperationException

可能值得提出一个问题

现在你必须求助于像这样的变通办法

assert 12 == new BigInteger(3).intValue() << 2
//or
assert 12 == new BigInteger(3).shiftLeft( 2 )

assert 12==new biginger(3).intValue()所以,正如@injecteer所指出的,这似乎是Groovy中的一个bug

好消息是Groovy很容易通过类“mixin”进行“修复”:

类增强编号{
static def originallefstshift=org.codehaus.groovy.runtime.DefaultGroovyMethods&leftShift
静态数字左移位(数字自身、数字操作数){
self.class==BigInteger?self.shiftLeft(操作数):originalLeftShift(self,操作数)
}
}
数字混合(增强数字)
整数i=新整数(3)

assert 12==i所以,正如@injecteer所指出的,这似乎是Groovy中的一个bug

好消息是Groovy很容易通过类“mixin”进行“修复”:

类增强编号{
static def originallefstshift=org.codehaus.groovy.runtime.DefaultGroovyMethods&leftShift
静态数字左移位(数字自身、数字操作数){
self.class==BigInteger?self.shiftLeft(操作数):originalLeftShift(self,操作数)
}
}
数字混合(增强数字)
整数i=新整数(3)

assert 12==i执行该操作:
Number n=new biginger(“3”);println(n这是一个静态方法,类似于
DefaultGroovyMethods.leftShift()
isay@seelenvirtuse
Number n=new biginger(“3”);println(n结论:这是Groovy中的一个bug(很长一段时间),它将在版本4.0、3.0.5和2.5.13中修复。这是否有效:
Number n=new biginger(“3”);println(n这是静态方法,使用类似
DefaultGroovyMethods.leftShift()
I'dsay@seelenvirtuse
Number n=new biginger(“3”);println(n结论:这是Groovy中的一个bug(很长一段时间),它将在4.0、3.0.5和2.5.13版本中修复。解决方案将与任何真正的大整数中断谢谢,我报告了问题:我们已经有了一个!天哪,从我问起不到24小时,所以…解决方案将与任何真正的大整数中断谢谢,我报告了问题:我们已经有了一个!天哪,从我问起不到24小时,所以。。。
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