Могут ли функции быть значениями параметров по умолчанию? - PullRequest
0 голосов
/ 05 июля 2018

В документации Kotlin говорится, что «функции первоклассны». Я пытаюсь использовать функцию в качестве значения по умолчанию для расширения функции. Однако компилятор не имеет ничего из этого:

fun <T> identity(x: T): T = x
fun <T, P> Channel<T>.dedupe(by: (T) -> P = ::identity): ReceiveChannel<T>
{
    ...
}

Ошибка: Function invocation 'identity(...)' expected, что вроде указывает на то, что Котлин не совсем понимает, что я хочу сделать.

Есть ли способ?

1 Ответ

0 голосов
/ 05 июля 2018

Я не знаю, почему вы получаете это сообщение об ошибке, но проблема заключается в несоответствии типов: значение по умолчанию должно иметь смысл для любых параметров типа (с учетом границ). То есть вам нужно (T) -> P, но ::identity может дать вам (T) -> T или (P) -> P.

Доказательство: если вы измените на

fun <T, P> identity(x: T): P = throw Exception()
fun <T, P> List<T>.dedupe(by: (T) -> P = ::identity): Unit {}

компилируется.

Ответ (который вышел в комментариях ниже):

Если P изменить на Any?, мы сможем использовать ::identity, поскольку (T) -> T является подтипом (T) -> Any?. К сожалению, это не работает, но использование лямбды вместо ссылки на функцию:

fun <T> identity(x: T): T = x
fun <T> Channel<T>.dedupe(by: (T) -> Any? = { it }): ReceiveChannel<T>
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...