Универсальная функция работает, а универсальный класс - нет? - PullRequest
0 голосов
/ 30 сентября 2018

Я хотел бы класс, который является универсальным для KProperty1, я могу сделать это для функции, но не для класса:

import kotlin.reflect.KProperty1

data class Dog(val name: String, val age: Int)

fun <P: KProperty1<*, *>> reflectionHelper(input: P) = input.name

fun <P: KProperty1<*, *>> getReflectionHelper(clazz: P) = ReflectionHelper<P>()

class ReflectionHelper<P: KProperty1<*, *>> {
}

fun main(args : Array<String>) {
    println(reflectionHelper(Dog::age))  // Works
    val helper1 = getReflectionHelper(Dog::age)  // Also Works
    val helper2 = ReflectionHelper<Dog::age>()  // Error: Type inference failed
}

1 Ответ

0 голосов
/ 30 сентября 2018

Dog::age - это значение (типа KProperty1<Dog, String>), а не тип.В промежутке между < и > вам нужно указать тип или вы должны полностью его опустить, и тип будет выведен (это то, что происходит в первых двух строках).

Таким образом, эквивалентом fun будет

class ReflectionHelper<P: KProperty1<*, *>>(input: P) { ... }
val helper2 = ReflectionHelper(Dog::age)

Если вам не нужен input: P в качестве параметра, вам нужно будет явно указать P обадля fun и для class.

...