Как провести различие между связанной ссылочной ссылкой элемента и функцией того же типа в котлин?

Когда дело доходит до подписи или определения метода, есть ли способ дифференцировать

users().indexOn(User::id) 

а также

 users().indexOn<User, String> { it.id() } 

? То есть, чтобы указать, что ссылка на связанный элемент требуется, а не экземпляр функции, или наоборот. Вот подпись вышеприведенного примера:

 fun <T: SomeType, U> indexOn(function: (T) -> U): List<U> 

На одной и той же ноте можно ли различать ссылку на конструктор и функцию, которая возвращает тип? Например, query(::SomeLookup) и query { SomeLookup(args) } (без kotlin.reflect, если это возможно)

Один из способов отличить лямбду от опорной функции в рамках системы типа используют интерфейс отражения KFunction<T> , например:

 fun <T> f(ref: T) where T : () -> Unit, T : KFunction<Unit> { /* ... */ } 

 fun g() { println("hello") } f(::g) // OK f { println("hello") } // Error: type parameter bound is not satisfied 

Хотя пока я не мог заставить это работать наоборот.

Кроме того, я не нашел способа отличить ссылку на конструктор по своему типу. Однако во время выполнения это легко сделать с помощью рефлексии: вы можете проверить, является ли javaConstructor KFunction<*> нулевым.