当前位置: 首页 > 知识库问答 >
问题:

如何在Java类中实现Kotlin挂起方法?

薛华容
2023-03-14

我有kotlin接口

interface MyKotlinInterface {
    suspend fun mySuspendableMethod(): List<String>
}

然后创建了一个Java类,并实现了MyKotlinInterface

public class MyJavaImpl implements MyKotlinInterface {

    @Nullable
    @Override
    public Object mySuspendableMethod(@NotNull Continuation<? super List<? extends String>> completion) {
        return null;
    }
}

IDE没有显示任何错误,但当我编译时,会出现以下错误

    null

@NotNull Continuation<? super List<? extends String>> completion
@NotNull Continuation completion

并且编译时错误已经消失。

共有1个答案

程修雅
2023-03-14

关于suspend方法如何在Kotlin中幕后工作的最好材料可能是Kotlin repo中的以下文件:https://github.com/jetbrains/Kotlin/pull/3709/files

正如您正确地注意到的,suspend关键字通知Kotlin编译器将函数转换为一个状态机器,或者用更熟悉的术语,转换为一个回调链。

为了在回调之间传递信息,我们需要一些东西来保存前一次计算的结果。这是您看到的continuation。在您的案例列表中,泛型类型是回调链中的最后一个调用应该产生的。

interface MyKotlinInterface<T> {
    suspend fun mySuspendableMethod(): List<T>
}
public class MyJavaImpl<T> implements MyKotlinInterface<T> {

    @Nullable
    @Override
    public Object mySuspendableMethod(@NotNull Continuation<? super List<? extends T>> $completion) {
        return List.of("A", "B");
    }
}
fun main() = runBlocking {
    val impl = MyJavaImpl<String>()

    println(impl.mySuspendableMethod())
}
 类似资料:
  • 我的Kotlin项目需要一个Java注释。 不幸的是,这似乎很困难。我在这里找到了这种讨论: https://discuss.kotlinlang.org/t/intdef-and-stringdef-not-being-checked-at-compile-time/7029/3 我明白这可能是一个Lint问题。不执行编译时检查。两人都没有提出任何建议。我可以添加任何字符串作为参数。 我最终用我

  • 今天,我在kotlin中实现了一个,正如我过去在java中所做的那样,我希望实现一个,作为最后的后退,以防客户机代码忘记关闭它,从而使关键资源无法回收。我认为此资源足够重要,可以添加此回退,尽管此回退不可靠。但是,没有声明方法,这意味着我不能简单地做到这一点: 但是这种变通方法需要一个超类。如果下次我的其他已经获得了一个超类,那么如果没有大量的样板文件,这个变通方法将无法工作。

  • 本文向大家介绍详解Kotlin中如何实现类似Java或C#中的静态方法,包括了详解Kotlin中如何实现类似Java或C#中的静态方法的使用技巧和注意事项,需要的朋友参考一下 大家可以在网络上搜到不少这样的文章,官方推荐是包级函数,也有人说用伴生对象(companion class)。这些都是不错的选择,但并不完善,我们在不同的情况下有更好的选择。我总结了几种方法,分别是:包级函数、伴生对象、扩展

  • 我正在尝试从 Java 7 调用科特林函数。我正在使用协程,这个被调用的函数正在挂起,例如: 我在版本 0.25.3 中使用了协程,我可以通过传递继续来模拟简单的 Java 回调样式 ,但是我使用的是Android,这意味着只使用Java 7。另一方面,简单的< code>Future太愚蠢了,因为我不想定期检查函数是否完成——我只想在函数完成时被调用。我真的希望避免添加新的库或许多额外的类/方法

  • 考虑一下问题: 我们有一个带有抽象方法的类。现在,我们希望强制此方法的每个覆盖都将执行一些参数检查或其他一些苦差事。我们希望此参数检查在所有覆盖中都相同。一种解决方案是将此行为包装在一个调用抽象方法的非抽象方法中: 我想让私有,这样的任何子类都不能在不检查其参数的情况下偶然调用它。不幸的是,这是不可能的: 错误:(9,5)Kotlin:修饰符“private”与“abstract”不兼容 Kotl

  • 嗨,我是Kotlin世界的新手。我喜欢到目前为止所看到的,并开始考虑将我们在应用程序中使用的一些库从Java转换为Kotlin。 第二次更新:问题是如何用Kotlin中的一些参数为一个简单的pojo编写一个构建器设计模式?下面的代码是我的尝试,方法是编写java代码,然后使用eclipse-kotlin-plugin转换为Kotlin。