【发布时间】:2020-01-27 00:07:16
【问题描述】:
假设我有一个像下面这样的课程:
abstract class AbsTest {
fun test(k: String, v: String? = null) {
println("Key - $k, Value - $v")
}
}
还有一个继承自它的类:
class Test : AbsTest { ... }
我的主要功能如下所示:
fun main() {
Test().test("Hello")
}
这绝对没问题。但是,如果我在 Kotlin 多平台中执行此操作,则会失败。这是我的 KMP 代码:
expect abstract class AbsTest {
fun test(k: String, v: String? = null)
}
// Android Target
actual abstract class AbsTest {
fun test(k: String, v: String?) { ... }
}
class Test : AbsTest { ... }
// Calling Place
fun finalTest() {
Test().test("Hello")
}
上面的 KMP 代码抛出以下异常:
java.lang.NoSuchMethodError: No static method test$default(...) in class AbsTest found
出于好奇,当我反编译代码以检查生成的字节码时,我发现它没有为 KMP 项目生成 $default 方法而另一个工作正常的问题。
反编译代码(普通 Kotlin 项目)
public abstract class AbsTest {
public final void test(@NotNull String k, @Nullable String v) {
...
}
public static void test$default(AbsTest var0, String var1, String var2, int var3, Object var4) {
...
}
}
反编译代码(KMP 项目)
public abstract class AbsTest {
public final void test(@NotNull String k, @Nullable String v) {
...
}
// No test$default() method generated
}
KMP 有这种行为的原因是什么?如何解决这个问题?
【问题讨论】:
-
看起来像一个错误?根据youtrack.jetbrains.com/issue/KT-21913 应该支持它(+ youtrack.jetbrains.com/issue/KT-34823 说“如果 someFun 没有暂停,它就可以正常工作”),所以它可能特定于你的情况,应该在那里报告,特别是如果你可以做一个小繁殖。
-
看起来问题(带有暂停乐趣)已修复 - youtrack.jetbrains.com/issue/KT-24461
标签: kotlin kotlin-multiplatform