Хороший вопрос, и он кажется невозможным (используя ссылки на функции).Я попытался указать ожидаемый тип явно:
val f: MutableList<Circle>.((Circle) -> Float) -> Unit =
if (ascending) MutableList<Circle>::sortBy else MutableList<Circle>::sortByDescending
, но в сообщении об ошибке говорится:
Ошибка вывода типа.Пожалуйста, попробуйте явно указать аргументы типа.
и грамматика не позволяет этого:
callableReference
: (receiverType? '::' (simpleIdentifier | 'class'))
;
т.е. за ::
может следовать толькоидентификатор или class
.Это странная дыра, потому что грамматика Java допускает параметры типа перед именем метода.
Связанные ссылки тоже не помогают:
(circles::sortBy) { it.radius } // doesn't compile
Не работает даже явный тип, что меня довольно удивило:
val f: ((Circle) -> Float) -> Unit = circles::sortBy
но это так:
val f: ((Circle) -> Float) -> Unit = { circles.sortBy(it) }
Таким образом, в конечном итоге вы можете написать (скобки вокруг лямбды обязательны)
val f: ((Circle) -> Float) -> Unit =
if (ascending) ({ circles.sortBy(it) }) else ({ circles.sortByDescending(it) })
f { it.radius }
, но, вероятно, не хотите!