В Kotlin 1.2 я не нашел KFunction0<T>
, но только KFunction<T>
, и я смог сделать то, что вы хотели:
import kotlin.reflect.*
import kotlin.test.assertEquals
class MyKF : KFunction<Int>{ // In Kotlin 1.3 you can extend KFunction0<Int>
override val annotations: List<Annotation>
get() = listOf()
override val isAbstract: Boolean
get() = false
override val isExternal: Boolean
get() = false
override val isFinal: Boolean
get() = true
override val isInfix: Boolean
get() = false
override val isInline: Boolean
get() = false
override val isOpen: Boolean
get() = false
override val isOperator: Boolean
get() = false
override val isSuspend: Boolean
get() = false
override val parameters: List<KParameter>
get() = listOf()
override val typeParameters: List<KTypeParameter>
get() = listOf()
/**
* I am not sure how get proper return type. So... This KFunction will return kotlin.Number.
*/
override val returnType: KType
get() = Int::class.supertypes[0]
override val visibility: KVisibility?
get() = KVisibility.PUBLIC
override fun call(vararg args: Any?): Int {
return 0
}
override fun callBy(args: Map<KParameter, Any?>): Int {
return 0
}
override val name: String
get() = "f"
// Sience Kotlin 1.3
override fun invoke(): Int {
return 0
}
}
fun main(args: Array<String>) {
val kf = MyKF()
assertEquals("f", kf.name)
assertEquals(0, kf.call())
println(kf.returnType)
println(kf.name)
println(kf.call())
pritnln(kf.invoke())
}
Я обновлю Kotlin до 1,3 позже, и я завершумой ответ (если он работает в Kotlin 1.3).
Так где может быть ваша проблема?Может быть (просто удачное предположение) проверить тип на основе переопределенных методов, таких как returnType
?
Редактировать:
После перехода на Kotlin 1.3 я смог расширить KFunction0<Int>
вместо KFunction<Int>
.Единственные изменения - мой класс также должен переопределить invoke(): Int
.Все еще работает!
Edit2:
Я не уверен, что я просто не видел KFunction0 в моей IDE или отсутствует в Kotlin ниже 1.3.