首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >expect带有默认参数的抽象类不会生成$default静态方法

expect带有默认参数的抽象类不会生成$default静态方法
EN

Stack Overflow用户
提问于 2020-01-26 23:25:29
回答 1查看 553关注 0票数 0

假设我有一个如下所示的类:

代码语言:javascript
复制
abstract class AbsTest {
    fun test(k: String, v: String? = null) {
        println("Key - $k, Value - $v")
    }
}

和一个继承自它的类:

代码语言:javascript
复制
class Test : AbsTest { ... }

我的main函数看起来像这样:

代码语言:javascript
复制
fun main() {
    Test().test("Hello")
}

这绝对可以正常工作。但是,如果我在Kotlin Multi-platform中执行此操作,则会失败。下面是我的KMP代码:

代码语言:javascript
复制
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代码抛出下面的异常:

代码语言:javascript
复制
java.lang.NoSuchMethodError: No static method test$default(...) in class AbsTest found

出于好奇,当我反编译代码以检查生成的字节码时,我发现了一个问题,即它不能为KMP项目生成$default方法,而另一个方法工作得很好。

反编译代码(普通Kotlin项目)

代码语言:javascript
复制
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项目)

代码语言:javascript
复制
public abstract class AbsTest {
    public final void test(@NotNull String k, @Nullable String v) {
        ...
    }
    // No test$default() method generated
}

为什么KMP会这样呢?如何解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2020-01-27 00:07:17

正如您所说的,您已经发现了问题。kotlin编译器不知何故不能编译默认方法。但是,作为变通方法,您可以使用两种不同的方法,如下所示。

代码语言:javascript
复制
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);
        }
        . . .
    }
}

希望这能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59919778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档