我能否获得对Kotlin中具有默认参数的函数的函数引用作为无参数函数?

时间:2019-09-23 21:14:43

标签: kotlin function-reference

是否可以获取对具有默认参数的函数的引用,该默认参数指定为无参数调用?

InputStream.buffered()是一种扩展方法,可将InputStream转换为缓冲区大小为8192字节的BufferedInputStream

public inline fun InputStream.buffered(bufferSize: Int = DEFAULT_BUFFER_SIZE): BufferedInputStream =
    if (this is BufferedInputStream) this else BufferedInputStream(this, bufferSize)

我想使用默认参数有效地引用扩展方法,并将其传递给另一个函数。

fun mvce() {
    val working: (InputStream) -> InputStream = { it.buffered() }

    val doesNotCompile: (InputStream) -> BufferedInputStream = InputStream::buffered
    val alsoDoesNotCompile: (InputStream) -> InputStream = InputStream::buffered
}

doesNotCompilealsoDoesNotCompile产生以下错误

  

类型不匹配:推断的类型为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

1 个答案:

答案 0 :(得分:1)

正如注释中提到的gpuntoPawel一样,使用-XXLanguage:+NewInference编译器参数允许使用默认值引用函数。

该问题已here被跟踪,并且针对Kotlin 1.4.0。