假设我有一个如下所示的类:
abstract class AbsTest {
fun test(k: String, v: String? = null) {
println("Key - $k, Value - $v")
}
}和一个继承自它的类:
class Test : AbsTest { ... }我的main函数看起来像这样:
fun main() {
Test().test("Hello")
}这绝对可以正常工作。但是,如果我在Kotlin Multi-platform中执行此操作,则会失败。下面是我的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会这样呢?如何解决这个问题?
发布于 2020-01-27 00:07:17
正如您所说的,您已经发现了问题。kotlin编译器不知何故不能编译默认方法。但是,作为变通方法,您可以使用两种不同的方法,如下所示。
expect abstract class AbsTest {
// fun test(k: String, v: String? = null)
fun test(k: String)
fun test(k: String,v: String?)
}
// Android Target
actual abstract class AbsTest {
fun test(k: String) { . . .}
fun test(k: String, v: String?) {
if(v==null){
test(k);
}
. . .
}
}希望这能有所帮助
https://stackoverflow.com/questions/59919778
复制相似问题