我已声明一个"表达式变量" (抱歉,我不确定如何命名)在Kotlin课程中:
class Something {
var onSelectionListener: (view: View, position: Int) -> Unit = {_, _ -> }
}
这样我就可以使用Lambda为这个变量赋一个表达式。从另一个Kotlin类调用这个类时它很有用。
something.onSelectionListener = { ... }
但现在我想让Java类能够做到:
something.setOnSelectionListener(new Something.OnSelectionListener() {
@Override
public void onItemSelected(View view, int position) {
//...
}
});
这就是命名。因为它已经可以做到:
something.setOnSelectionListener(new Function2<View, Integer, Unit>() {
@Override
public Unit invoke(View view, Integer integer) {
//....
}
});
但那些Function2
,invoke
和Unit
对可读性不利。
如何更改这些生成的名称(我希望可能有一些注释可以实现这一点),同时保留了Kotlin类的调用仍然可以使用Lambda来分配表达式而不是创建匿名类的效果? / p>
答案 0 :(得分:3)
Function2是Kotlin生成的文件的一部分,你不能从那里改变任何东西。
所以有两种方法可以解决这个问题:
在您的应用程序中使用JDK 8。使用相同的代码,您可以在Java代码中调用它。
s = Something();
s.setOnSelectionListener((view, position) -> {
...
return null;
});
如果您不能使用JDK 8,并且需要使用JDK 7,那么最好的方法是创建一个匿名类或接口。此外,它仍然很简单,无论你是用Kotlin还是Java写作,都会让它更具可读性。
示例:强>
Something.kt
class Something {
lateinit var onSelectionListener: OnSelectionListener
interface OnSelectionListener {
fun onItemSelected(view: View, position: Int)
}
}
SomethingJava.java
s = new Something();
s.setOnSelectionListener(new Something.OnSelectionListener() {
@Override
public void onItemSelected(@NotNull View view, int position) {
}
});