Я не знаю, почему вы получаете это сообщение об ошибке, но проблема заключается в несоответствии типов: значение по умолчанию должно иметь смысл для любых параметров типа (с учетом границ). То есть вам нужно (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>
{
...
}