Kotlin:使Java函数可调用中缀

时间:2017-03-15 05:33:09

标签: kotlin

尝试使用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方法标记为中缀?也许是注释?

1 个答案:

答案 0 :(得分:6)

这是因为当你在做的时候:

$query = "SELECT * FROM plates WHERE "; $pattern = "number LIKE '%%%s%%' "; $input = "8765"; $c = strlen($input); // 8765 returns 4, 456 returns 3 etc. for ($i = 0; $i < $c; $i++) { $pattern2 = ""; $pattern2 = sprintf($pattern, $input[$i]); if ($i < ($c - 1)) { // the last LIKE statement should not have AND $pattern2 .= "AND "; } $query .= $pattern2; } echo $query // SELECT * FROM plates WHERE number LIKE '%8%' AND number LIKE '%7%' AND number LIKE '%6%' AND number LIKE '%5%'

你实际上是在递归你的中缀函数。 BigInteger没有带有另一个BigInteger的pow函数 - 这就是你在这里定义的内容。不要忘记,仍然可以使用点运算符调用中缀函数!

你可能想要写的是:

this.pow(x)

如果要重用BigInteger的pow方法,我们需要转换为int。不幸的是,这可能是有损的并且可能会溢出。如果这是一个问题,您可能需要考虑编写自己的pow方法。

没有办法将Java方法“本地”标记为中缀。您只能通过使用包装器来实现此目的。