gpt4 book ai didi

kotlin - 函数可以是默认参数值吗?

转载 作者:行者123 更新时间:2023-12-02 01:00:10 29 4
gpt4 key购买 nike

Kotlin 文档声明“函数是一流的”。我正在尝试将函数用作函数扩展的默认值。但是编译器没有任何它:

fun <T> identity(x: T): T = x
fun <T, P> Channel<T>.dedupe(by: (T) -> P = ::identity): ReceiveChannel<T>
{
...
}

错误是 Function invocation 'identity(...)' expected 这有点表明 Kotlin 根本不理解我想做什么。

有办法吗?

最佳答案

我不知道您为什么会收到此错误消息,但问题是类型不匹配:默认值必须对任何类型参数(受限)有意义。 IE。你需要一个 (T) -> P,但是 ::identity 可以给你 (T) -> T 或者 (P ) -> P

证明:如果你改成

fun <T, P> identity(x: T): P = throw Exception()
fun <T, P> List<T>.dedupe(by: (T) -> P = ::identity): Unit {}

它编译。<​​/p>

答案(出现在下面的评论中):

如果 P 更改为 Any?,我们应该能够使用 ::identity 因为 (T) -> T(T) -> Any? 的子类型。不幸的是,它不起作用,但是使用 lambda 而不是函数引用可以:

fun <T> identity(x: T): T = x
fun <T> Channel<T>.dedupe(by: (T) -> Any? = { it }): ReceiveChannel<T>
{
...
}

关于kotlin - 函数可以是默认参数值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51190819/

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