Функция расширения возвращает результат параметра типа Foo
. Таким образом, тип результата может быть выведен из типа получателя.
И тип результата функции-члена не имеет ничего общего с параметром типа Foo
, кроме имени, что ничего не значит для компилятора. Вы можете увидеть, что T
в методе и T
в классе - это разные типы, написав и скомпилировав следующий код:
Foo<BarImpl>().get<BarImpl2>()
Если вы хотите сделать get
функцией-членом, которая возвращаетВ результате Foo
параметра типа вы должны удалить параметр типа из функции и внедрить экземпляр класса через конструктор:
class Foo<T : Bar>(private val clazz: KClass<T>) {
fun get(): T {
return SomeMap(this).get(clazz)
}
companion object {
inline operator fun <reified T : Bar> invoke() = Foo(T::class)
}
}