kotlin - 期望具有默认参数的抽象类不会生成 $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为什么会这样?如何解决这个问题?
解决方案
如您所说,您已经发现了问题。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);
}
. . .
}
}
希望这可以帮助
推荐阅读
- python - 为什么在 OpenCv 中将彩色图像读取为灰度与将相同图像从 BGR 转换为灰度不同
- javascript - JavaScript中的连接函数,对于元素数量未知的数组,分隔符未显示在末尾
- logstash - 是否可以使用 cf 事件作为 logstash 中的输入?
- xml - 需要 XSLT 将具有不同属性值的 xml 转换为具有 CDATA 的 xml
- angular - 将组件中的复选框绑定到其他组件中的表列的更好方法
- bash - 相同的 KSH 脚本在测试环境中运行,但在生产中失败
- phpspec - 使用 phpspec 测试输出缓冲
- processing - 处理:椭圆没有以 0.5 增长,但任何值都高于 1?
- css - 将引导主题导入到 ruby on rails 应用程序的问题
- matlab - 用 MATLAB 拟合多输入多输出函数