Kotlin:使 Java 函数可调用中缀

2023-11-30

试图使powBigInteger 类中的函数可用作同名的中缀函数。问题是现在的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)
}

Causes:

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 方法“本机”标记为中缀。您只能通过使用包装器来完成此操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin:使 Java 函数可调用中缀 的相关文章

随机推荐