java - 为什么可以使用默认参数而不是方法调用 kotlin 的构造函数?

标签 java kotlin default-value

我很好奇为什么可以使用默认参数调用 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$default

方法。它是静态的,我不能从 java 中调用它(idea 不允许我这样做)。并且只添加

@JvmOverloads

使用默认 arg 对 kotlin 方法的注释创建了一个可以从 java 端访问的方法。

问题是为什么有两种方法可以从 java 调用 kotlin 的默认值?为什么不默认做所有可访问/不可访问的事情?这是一个糟糕的设计还是有充分的理由这样做?

最佳答案

我相信,当前设计背后的考虑是基于这样一个事实,即类中存在默认(无参数)构造函数是 JVM 上广泛使用的约定:有许多依赖它的库和框架(例如依赖注入(inject)工具,JSR-305)。因此,在所有参数都有默认值时生成无参数构造函数支持这些用例,并且可能是用户所期望的。

相反,函数通常没有所有参数的默认值,我认为 Java 世界中的任何习语都不需要它。此外,您可以预期 Kotlin 类中有许多具有默认值的函数,默认情况下为它们生成重载会导致不希望的方法数量增长,这对 Android 尤为重要。

关于java - 为什么可以使用默认参数而不是方法调用 kotlin 的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48531600/

相关文章:

c# - 如何告诉 XmlSerializer 始终使用 [DefautValue(...)] 序列化属性?

c# - C# 中的默认非索引器属性

java - Restful Web 服务 - java.lang.NoSuchMethodError concat(Ljava/lang/Iterable;Ljava/lang/Iterable;)Ljava/lang/Iterable

java - 从类路径上的类开始运行 Java 程序

Android Kotlin Retrofit,等待暂停外的响应

kotlin - 为什么在协程 block 内直接调用 `async`不继承SupervisorJob?

javascript - 如何使用 Jquery 获取添加的输入字段的值?

java - 从 3.2 迁移到 4.1 后,Spring MVC 中的 POST 请求不起作用

JavaCC - XPath 解析器

android - 用户在Kotlin中授予使用访问权限后,如何导航回我的应用程序