Kotlin:使Java函数可调用中缀
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin:使Java函数可调用中缀相关的知识,希望对你有一定的参考价值。
试图使用BigInteger类中的pow
函数作为具有相同名称的中缀函数。问题是现在pow
中缀运算符递归调用自身。
是否可以使用与函数同名的中缀运算符使Java函数可调用?
package experiments
import java.math.BigInteger
infix fun BigInteger.pow(x: BigInteger): BigInteger {
return this.pow(x);
}
fun main(args : Array<String>) {
val a = BigInteger("2");
val b = BigInteger("3");
println(a + b)
println(a pow b)
}
原因:
Exception in thread "main" java.lang.StackOverflowError
at kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull(Intrinsics.java:126)
at experiments.KotlinTestKt.pow(KotlinTest.kt)
at experiments.KotlinTestKt.pow(KotlinTest.kt:6)
如果我定义自己的Java类(而不是使用库类),有没有办法将Java方法标记为中缀?也许是一个注释?
答案
这是因为当你做的时候:
this.pow(x)
你实际上是在递归你的中缀函数。 BigInteger没有带有另一个BigInteger的pow函数 - 这就是你在这里定义的内容。不要忘记,仍然可以使用点运算符调用中缀函数!
你可能想要写的是:
infix fun BigInteger.pow(x: BigInteger): BigInteger {
// Convert x to an int
return pow(x.longValueExact().toInt())
}
fun main(args : Array<String>) {
val a = BigInteger("2")
val b = BigInteger("3")
println(a + b)
println(a pow b)
}
如果你想重用BigInteger的pow方法,我们需要转换为int。不幸的是,这可能是有损的并且可能会溢出。如果这是一个问题,您可能需要考虑编写自己的pow方法。
没有办法将Java方法“本地”标记为中缀。您只能通过使用包装器来完成此操作。
以上是关于Kotlin:使Java函数可调用中缀的主要内容,如果未能解决你的问题,请参考以下文章