gpt4 book ai didi

lambda - 不包括可选参数的类型的引用构造函数

转载 作者:行者123 更新时间:2023-12-02 01:04:23 28 4
gpt4 key购买 nike

我有 A 类型的类,它有构造函数,需要参数 x 并且有一些可选参数:

class A(x: String, y: String = "default_y")

现在我想引用带有必需参数的构造函数:

var 函数:(字符串)-> A =::A

现在我遇到了类型不兼容的问题,因为该构造函数的签名是 2 个字符串,而不仅仅是一个。

当我添加这个构造函数重载时,编译器停止报错:

class A(x: String, y: String = "default_y") {

constructor(x: String): this(x, "default_y")
}
//added just so you can see full code
var function: (String) -> A = ::A

我现在得到了一点冗余。我当然可以对此做一些事情(将 "default_y" 提取为常量或从主构造函数中删除默认参数)以消除冗余,但这只是糖代码,实际上并没有做任何事情。只是允许我在没有提示的情况下引用它。有没有办法将构造函数(可能还有函数)引用为仅具有必需参数的函数?

最佳答案

如前所述here还有here ,您不能通过反射使用默认参数。

The default value of a method parameter is an arbitrary expression which can only be represented as a chunk of bytecode; there is no other representation that can be used in reflection. Parameter Info retrieves default parameter values by parsing source code.

作为解决方法,您可以让编译器为您的构造函数生成 JVM 重载,然后使用 Java 反射来调用采用单个 String 参数的构造函数:

class A @JvmOverloads constructor(x: String, val y: String = "default_y")

val con: Constructor<A> = A::class.java.constructors
.filterIsInstance<Constructor<A>>()
.find { it.parameterCount == 1 } ?: throw IllegalStateException("Not found!")
val newInstance: A = con.newInstance("myArg")
println(newInstance.y) // Prints 'default_y'

编辑:

通过 callBy,您还可以使用 Kotlin 反射调用构造函数:

val con = MyClass::class.constructors.first()
val newInst =
con.callBy(mapOf(con.parameters.first() to "myArg"))

关于lambda - 不包括可选参数的类型的引用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48600494/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com