【问题标题】:expect abstract class with default argument doesn't generate $default static method期望具有默认参数的抽象类不会生成 $default 静态方法
【发布时间】: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 有这种行为的原因是什么?如何解决这个问题?

【问题讨论】:

标签: kotlin kotlin-multiplatform


【解决方案1】:

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

希望对你有帮助

【讨论】:

  • 这是解决方法。但不能成为真正的解决方案。因为这个解决方案违背了 Kotlin 提供的默认参数功能的目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 2012-09-21
  • 2012-12-03
  • 2015-03-26
  • 2016-12-14
  • 1970-01-01
相关资源
最近更新 更多