Lambda 如何使Kotlin表达式变量在Java中显示为命名接口?

Lambda 如何使Kotlin表达式变量在Java中显示为命名接口?,lambda,interface,kotlin,Lambda,Interface,Kotlin,我在Kotlin类中声明了一个“表达式变量”(抱歉,我不知道如何命名): class Something { var onSelectionListener: (view: View, position: Int) -> Unit = {_, _ -> } } 所以我可以使用Lambda为这个变量赋值一个表达式。当从另一个Kotlin类调用这个类时,它非常有效 something.onSelectionListener = { ... } 但现在我想让Java类能够:

我在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) {
            //....
        }
    });
something.setOnSelectionListener(新函数2(){
@凌驾
公共单元调用(视图,整数){
//....
}
});
但是那些
Function2
invoke
Unit
不利于可读性


如何更改这些生成的名称(我希望可能有一些注释可以实现这一点),同时保留Kotlin类的调用仍然可以使用Lambda分配表达式而不是创建匿名类的效果?

Function2是Kotlin生成的文件的一部分,您不能从中更改任何内容

因此,有两种方法可以解决这个问题:

  • 在应用程序中使用JDK 8。使用与您编写的代码相同的代码,您可以在Java代码中调用它

    s = Something();
    s.setOnSelectionListener((view, position) -> {
        ...
        return null;
    });
    
  • 如果您不能使用JDK 8,并且需要使用JDK 7,那么最好的方法是创建一个匿名类或接口。此外,它仍然很简单,无论您是用Kotlin还是Java编写,它都更具可读性

  • 示例:

    什么.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) {
    
            }
        });
    

    我无法控制用户是否在使用JDK8,因为我确实在编写一个库;至于声明接口,如果在Java文件(在Kotlin项目中)中声明接口,则使用Kotlin编写将失去接受lambda…@SiraLam的能力。尽管它只能是选择侦听器上的
    或选择侦听器上的
    内容,而不是选择侦听器上的
    内容。