我有一个Java示例,其中的方法实现为
@Override
public Function<ISeq<Item>, Double> fitness() {
return items -> {
final Item sum = items.stream().collect(Item.toSum());
return sum._size <= _knapsackSize ? sum._value : 0;
};
}IntelliJ将其自动翻译为Kotlin是
override fun fitness(): Function<ISeq<Item>, Double> {
return { items:ISeq<Item> ->
val sum = items.stream().collect(Item.toSum())
if (sum.size <= _knapsackSize) sum.value else 0.0
}
}(我明确了项的类型,并将return更改为0.0)
尽管如此,我仍然看到Java的函数和Kotlin原生lambda存在兼容性问题,但我对这些并不是最熟悉。错误是:

问题是:在这个示例中,是否可以在Kotlin中覆盖外部Java库的how ()方法?如果可以,如何覆盖?
发布于 2019-02-21 06:10:02
问题:
您将返回一个(Kotlin) lambda ISeq<Knapsack.Item> -> Double。但这不是你想要的。您想要返回一个Java Function<ISeq<Knapsack.Item>, Double>。
解决方案:
您可以使用SAM Conversion创建Function。
和Java8一样,
也支持转换。这意味着,只要接口方法的参数类型与Kotlin函数的参数类型匹配,就可以将Kotlin函数文字自动转换为具有单个非默认方法的Java接口实现。
我创建了一个最小的示例来演示这一点。假设您有一个Java类,如下所示:
public class Foo {
public Function<String, Integer> getFunction() {
return item -> Integer.valueOf(item);
}
}如果你想在Kotlin中覆盖getFunction,你可以这样做:
class Bar: Foo() {
override fun getFunction(): Function<String, Int> {
return Function {
it.toInt()
}
}
}发布于 2019-02-21 06:04:25
当将lambda作为Java的函数接口返回时,您必须使用显式SAM构造函数:
override fun fitness(): Function<ISeq<Item>, Double> {
return Function { items:ISeq<Item> ->
val sum = items.stream().collect(Item.toSum())
if (sum.size <= _knapsackSize) sum.value else 0.0
}
}另外,不要忘记导入java.util.function.Function,因为Kotlin有自己的同名类
https://stackoverflow.com/questions/54795618
复制相似问题