为什么有可能调用kotlin的构造函数的默认参数,但不是一个方法?
我很好奇为什么有可能调用kotlin的构造函数与默认参数,而不是从java代码的方法?
例如:
class Test(val test: String = "")
Java客户端:
void test() { new Test(); }
没关系。
但是如果我想用方法做同样的技巧,这是不可能的:
class Test { fun x(x: Int = 5) { } }
Java客户端,编译错误:
void test() { new Test().x(); }
在我看到的方法反编译为java字节码
X $默认
方法。 它是静态的,我不能从Java调用它(想法不允许我这样做)。 而且只有添加了
@JvmOverloads
使用默认arg的kotlin方法的注解创建了一个可从java端访问的方法。
问题是为什么有两种方法如何从java调用kotlin的默认值? 为什么不做一切可以访问/默认情况下不可访问? 这是一个糟糕的设计,还是有这个严肃的理由?
我相信,当前设计背后的考虑是基于以下事实:类中存在默认(无参数)构造函数是JVM上广泛使用的约定:依赖于它的许多库和框架(例如,dependency injection工具,JSR-305)。 因此,如果所有参数的默认值都支持这些用例,那么生成一个无参数的构造函数,用户可能会期望这样做。
相反,函数通常不具有所有参数的默认值,我不认为这是Java世界中任何习惯用法所需要的。 而且,在Kotlin类中可以预期很多具有默认值的函数,并且默认情况下为它们生成重载会导致不希望的方法计数增长,这对于Android尤其重要。
- 我可以在没有Kotlin的情况下运行Android Studio 3.0吗?
- 使用kapt时,Realm在Java / Kotlin项目中不生成RealmProxy类
- Cloud.orbit.exception.UncheckedException:不知道如何处理状态
- Kotlin \ Java – 如何获取更改的数组元素的总和
- 如何将一个整数数组传递给期望`Array <T>`的方法?
- JNI:直接缓冲区读写
- Android N Java 8function(Jack编译器)和Kotlin互操作
- 使用kapt时,Realm在Java / Kotlin项目中不生成RealmProxy类
- Lwjgl 3,如何获取当前线程中的OpenGL上下文?