Могу ли я получить ссылку на функцию с параметрами по умолчанию в Kotlin, как функцию без параметров? - PullRequest
6 голосов
/ 24 сентября 2019

Можно ли получить ссылку на функцию для функции, параметры которой по умолчанию определены как вызов без параметров?

InputStream.buffered() - это метод расширения, который преобразует InputStream в BufferedInputStream сразмер буфера 8192 байта.

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
}

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...