Lambda 如何使Kotlin表达式变量在Java中显示为命名接口?
我在Kotlin类中声明了一个“表达式变量”(抱歉,我不知道如何命名):Lambda 如何使Kotlin表达式变量在Java中显示为命名接口?,lambda,interface,kotlin,Lambda,Interface,Kotlin,我在Kotlin类中声明了一个“表达式变量”(抱歉,我不知道如何命名): class Something { var onSelectionListener: (view: View, position: Int) -> Unit = {_, _ -> } } 所以我可以使用Lambda为这个变量赋值一个表达式。当从另一个Kotlin类调用这个类时,它非常有效 something.onSelectionListener = { ... } 但现在我想让Java类能够:
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) {
//....
}
});
something.setOnSelectionListener(新函数2(){
@凌驾
公共单元调用(视图,整数){
//....
}
});
但是那些Function2
、invoke
和Unit
不利于可读性
如何更改这些生成的名称(我希望可能有一些注释可以实现这一点),同时保留Kotlin类的调用仍然可以使用Lambda分配表达式而不是创建匿名类的效果?Function2是Kotlin生成的文件的一部分,您不能从中更改任何内容 因此,有两种方法可以解决这个问题:
s = Something();
s.setOnSelectionListener((view, position) -> {
...
return null;
});
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) {
}
});
我无法控制用户是否在使用JDK8,因为我确实在编写一个库;至于声明接口,如果在Java文件(在Kotlin项目中)中声明接口,则使用Kotlin编写将失去接受lambda…@SiraLam的能力。尽管它只能是选择侦听器上的
或选择侦听器上的内容,而不是选择侦听器上的内容。