Zym*_*mus 6 kotlin function-reference
是否可以获取具有默认参数的函数的函数引用,该默认参数指定为无参数调用?
InputStream.buffered()是一种扩展方法,可将a InputStream转换BufferedInputStream为8192字节的缓冲区大小。
public inline fun InputStream.buffered(bufferSize: Int = DEFAULT_BUFFER_SIZE): BufferedInputStream =
if (this is BufferedInputStream) this else BufferedInputStream(this, bufferSize)
Run Code Online (Sandbox Code Playgroud)
我想有效地使用默认参数引用扩展方法,并将其传递给另一个函数。
fun mvce() {
val working: (InputStream) -> InputStream = { it.buffered() }
val doesNotCompile: (InputStream) -> BufferedInputStream = InputStream::buffered
val alsoDoesNotCompile: (InputStream) -> InputStream = InputStream::buffered
}
Run Code Online (Sandbox Code Playgroud)
doesNotCompile并alsoDoesNotCompile产生以下错误
类型不匹配:推断的类型为KFunction2,但应为(InputStream)-> BufferedInputStream
类型不匹配:推断的类型为KFunction2,但应为(InputStream)-> InputStream
我知道错误是因为InputStream.buffered()实际上(InputStream) -> BufferedInputStream不是,而是的快捷方式(InputStream, Int) -> BufferedInputStream,将缓冲区大小作为参数传递给BufferedInputStream构造函数。
动机主要是样式方面的原因,我宁愿使用已经存在的引用,也不愿在最后一刻创建引用。
val ideal: (InputStream) -> BufferedInputStream = InputStream::buffered// reference extension method with default parameter
val working: (InputStream) -> BufferedInputStream = { it.buffered() }// create new (InputStream) -> BufferedInputStream, which calls extension method
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |