【问题标题】:Can we pass java method to to kotlin function of type () -> Unit?我们可以将 java 方法传递给 () -> Unit 类型的 kotlin 函数吗?
【发布时间】:2018-04-18 10:46:08
【问题描述】:

我有一个像下面这样的 kotlin 方法

 fun initDrawer(drawerView: DrawerView, drawerLayout: DrawerLayout, context: Context, onRefreshClick: ()  -> Unit) {
  }

但是当我尝试通过 initDrawer(drawerView,drawerlayout,this,onRefreshClick()) 它给了我一个错误 required () cannot be applied to(kotlin.Unit)

是否可以将方法从 java 传递给 kotlin。

【问题讨论】:

标签: java android kotlin


【解决方案1】:

您必须将 onRefreshClick 的返回值设置为单位:

private Unit onRefreshClick() {
    //do something here
    return Unit.INSTANCE;
}

那么你可以这样称呼它:

initDrawer(drawerView, drawerLayout, this, this::onRefreshClick);

【讨论】:

  • () -> Unit 是一个返回 Unit 的函数 (lambda)。单元 onRefreshClick() { } 是你所需要的。
【解决方案2】:

您不能直接从 Java 传递您的 Java 方法,因为 Kotlin 参数期望该方法返回 Unit

您可以遵循以下模式:

kotlinClass.higherOrderFunction(() -> {functionToPass(); return Unit.INSTANCE;});

其中functionToPass() 定义为:

private void functionToPass() {
    // do something
}

在你的情况下:

initDrawer(drawerView, drawerlayout, this, 
  () -> {onRefreshClick(); return Unit.INSTANCE;}) 

【讨论】:

    【解决方案3】:

    假设您的 Java 方法位于一个名为 Test 的类中:

    public class Test {
        void onRefreshClick() {
            System.out.println("test");
        }
    }
    

    您的 Kotlin 函数可以像这样调用它(作为参考):

    val t = Test()
    initDrawer(drawerView, drawerlayout, this, t::onRefreshClick)
    

    onRefreshClick 在 Java 中也可以是静态的,这样您就可以像这样使用它:

    initDrawer(drawerView, drawerlayout, this, Test::onRefreshClick)
    

    注意: 在 Kotlin 中,() -> Unit 是没有参数且不返回任何内容的函数类型(返回类型是 Unit 而不是 Nothing)。

    Java 中没有Unit。与此类型对应的 Java 方法将没有参数,并且返回类型为void

    【讨论】:

    • onRefreshClick() 是java方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多