also/apply 的意外行为,无法将实例函数的引用传递到 also/apply
Unexpected behavior of also/apply, cannot pass references of a instance function into also/apply
用几句话来总结这个问题,关键是:
The also(strings::add)
doesn't work, it says Type inference failed
fun test() = "Test String"
val strings = mutableListOf<String>()
// Type inference failed: inline fun <T> T.also(block: (T) -> Unit): T cannot be applied to receiver: String arguments: (<unknown>)
// None of the following functions can be called with the arguments supplied: public abstract fun add(index: Int, element: String): Unit defined in kotlin.collections.MutableList public abstract fun add(element: String): Boolean defined in kotlin.collections.MutableList
test().also(strings::add).let { /* Use the string later */ }
虽然对 let
做同样的事情确实在同一个地方工作:
val strings = mutableListOf<String>()
test().let(strings::add).let { println(it) } // prints true, no compile errors.
Here 是最小的可重现代码。
我想稍后使用该字符串,所以不想在这里使用 let。我应该怎么办?如果我尝试使用 apply,可能会出现相同的编译错误,因为 also 和 apply 都具有相同的 KFunction1<T, T>
回调签名。如何使用 also/apply 传递这些类型的引用?
override fun add(element: E): Boolean
如您所见,函数 returns Boolean
,但 apply
接受 block: T.() -> Unit
,即它只接受接收单个参数且 return 没有值。
用几句话来总结这个问题,关键是:
The
also(strings::add)
doesn't work, it saysType inference failed
fun test() = "Test String"
val strings = mutableListOf<String>()
// Type inference failed: inline fun <T> T.also(block: (T) -> Unit): T cannot be applied to receiver: String arguments: (<unknown>)
// None of the following functions can be called with the arguments supplied: public abstract fun add(index: Int, element: String): Unit defined in kotlin.collections.MutableList public abstract fun add(element: String): Boolean defined in kotlin.collections.MutableList
test().also(strings::add).let { /* Use the string later */ }
虽然对 let
做同样的事情确实在同一个地方工作:
val strings = mutableListOf<String>()
test().let(strings::add).let { println(it) } // prints true, no compile errors.
Here 是最小的可重现代码。
我想稍后使用该字符串,所以不想在这里使用 let。我应该怎么办?如果我尝试使用 apply,可能会出现相同的编译错误,因为 also 和 apply 都具有相同的 KFunction1<T, T>
回调签名。如何使用 also/apply 传递这些类型的引用?
override fun add(element: E): Boolean
如您所见,函数 returns Boolean
,但 apply
接受 block: T.() -> Unit
,即它只接受接收单个参数且 return 没有值。