Можно ли получить ссылку на функцию для функции, параметры которой по умолчанию определены как вызов без параметров?
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