首页 > 解决方案 > 期望具有默认参数的抽象类不会生成 $default 静态方法

问题描述

假设我有一个像下面这样的课程:

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为什么会这样?如何解决这个问题?

标签: kotlinkotlin-multiplatform

解决方案


如您所说,您已经发现了问题。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);
        }
        . . .
    }
}

希望这可以帮助


推荐阅读