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

时间:2018-06-07 02:13:38

标签: lambda interface kotlin

我已声明一个"表达式变量" (抱歉,我不确定如何命名)在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) {
            //....
        }
    });

但那些Function2invokeUnit对可读性不利。

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

1 个答案:

答案 0 :(得分:3)

Function2是Kotlin生成的文件的一部分,你不能从那里改变任何东西。

所以有两种方法可以解决这个问题:

  1. 在您的应用程序中使用JDK 8。使用相同的代码,您可以在Java代码中调用它。

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

  3. 示例:

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