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

从Java调用Kotlin内联函数

宋安晏
2023-03-14

例外情况。kt:

@Suppress("NOTHING_TO_INLINE")
inline fun generateStyleNotCorrectException(key: String, value: String) =
        AOPException(key + " = " + value)

在科特林:

fun inKotlin(key: String, value: String) {
    throw generateStyleNotCorrectException(key, value) }

它在kotlin中工作,函数是内联的。

但是当在Java代码中使用时,它就是不能内联,仍然是一个正常的静态方法调用(从反编译的内容中可以看出)。

像这样的东西:

public static final void inJava(String key, String value) throws AOPException {
    throw ExceptionsKt.generateStyleNotCorrectException(key, value);
// when decompiled, it has the same contents as before , not the inlined contents.
}

共有2个答案

燕砚文
2023-03-14

是的,你能做到

在静态编程语言文件中:

    Builder.sendEvent { event ->
                    YandexMetrica.reportEvent(event)
                }
                .build();

在Java文件中:

    Builder.sendEvent(new Function1<String, Unit>() {
                    @Override
                    public Unit invoke(String event) {
                        Log.i("TEST", event);
                        return null;
                    }
                })
                .build();
高峻
2023-03-14

Java文件不支持Kotlin编译器所做的内联,因为Java编译器不知道这种转换(请参阅关于为什么具体化泛型在Java中根本不起作用的答案)。

至于内联的其他用例(最常见的情况是将lambda作为参数传入),正如您已经发现的,字节码包括一个公共静态方法,这样内联函数仍然可以从Java调用。然而,在这种情况下,不会发生内联。

 类似资料:
  • 简而言之:我想创建一个类型为的泛型类,它应该调用一个类型为的具体化内联函数,以便能够更通用地使用Gson 但是我希望我的其他类通过某个类实例调用这个函数。例如,类似于应该返回列表,而不是直接调用。我如何实现这样的功能?

  • 问题 当你编写使用回调函数的代码的时候,担心很多小函数的扩张可能会弄乱程序控制流。 你希望找到某个方法来让代码看上去更像是一个普通的执行序列。 解决方案 通过使用生成器和协程可以使得回调函数内联在某个函数中。 为了演示说明,假设你有如下所示的一个执行某种计算任务然后调用一个回调函数的函数(参考7.10小节): def apply_async(func, args, *, callback):

  • 我是一个本地开发人员和新的Unity。我试图发挥我的优势,在Kotlin编码,然后使用我的代码作为一个插件在Unity。我遇到的一个问题是,我不知道如何引用伴生对象内部的函数。 但我怎样才能在团结中也这样做呢?以下是我尝试过的。 我收到的错误是, AndroidJavaException:java.lang.NosuchMethodError:没有具有name='factory'signature

  • 这段代码适用于Java。但是在迁移到Kotlin之后,编译器higlits方法出现以下文本错误: Andswer是: 如果希望在另一个类中使用这个本机函数,可以指定包含它的类,如下所示:

  • 我在将这部分Java转换为Kotlin时遇到了问题: 方法的第二个参数(注意不是集合)接受。我尝试了几个解决方案,包括提供一个lambda: 但这导致: 错误:(32,38)Kotlin:意外标记 错误:(33,38)Kotlin:意外标记 错误:(31,56)Kotlin:类型不匹配:推断的类型是Kfunction1<@parametername mutablehttpresponse<>?,u

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