为什么Multiply运算符不适用于BigInteger?

时间:2018-03-29 10:07:28

标签: groovy operators

有人可以解释为什么乘法运算符抛出IllegalAccessException异常,而所有其他运算符按预期工作?

BigInteger plus = 10000000000000000000 + 100 // 10000000000000000100
BigInteger minus = 10000000000000000000 - 100 // 9999999999999999900
BigInteger div = 10000000000000000000 / 100 // 100000000000000000
BigInteger mod = 10000000000000000000 % 100 // 0
BigInteger pow = 10000000000000000000 ** 2 // 100000000000000000000000000000000000000
BigInteger star = 10000000000000000000 * 100 // java.lang.IllegalAccessException: Reflection is not allowed on java.math.BigInteger java.math.BigInteger.multiply(long)
  • Groovy版本: 2.4.4
  • Java版本: 1.7.0

1 个答案:

答案 0 :(得分:0)

确实,这不会发生在Groovy 2.4.later上(例如,我尝试使用.13)。在Groovy 2.4.4中,可能更早,这可以像你期望的那样工作:

new BigInteger("10000000000000000000") * new BigInteger("100")

然而,即使在2.4.13中仍存在溢出风险。考虑:

BigInteger b = 100000000 * 100
println b
// outputs 1410065408 because the multiplication of ints happens first, overflows, and the result is converted to BigInteger

虽然Groovy默认情况下可以将int转换为BigInteger,但数学运算可以(也许应该?我没有找到任何明确的指导)先发生。在你的例子中,我猜第一个是转换而第二个不是,这就是暴露了一些已修复过的bug。