我想从一个类中提供多个不同类型的不同委托。例如:
class A {
val instanceOfB = B()
val aNumber: SomeType by instanceOfB
val anotherNumber: SomeOtherType by instanceOfB
}
class B {
operator fun <T1: SomeType> getValue(thisRef: Any?, property: KProperty<T1>): T1 {
return SomeType()
}
operator fun <T2: SomeOtherType> getValue(thisRef: Any?, property: KProperty<T2>): T2 {
return SomeOtherType()
}
}
open class SomeType {}
open class SomeOtherType {}
此示例给出以下编译器错误:
'operator' modifier is inapplicable on this function: second parameter must be of type KProperty<*> or its supertype
是否可以通过某种方式指定泛型类型参数,以便实现这一目标?
答案 0 :(得分:1)
我只有通过这种方式才能编译和运行它,尽管我强烈建议除了概念验证之外不要使用它,因为内联会生成大量垃圾代码,并且每个getValue
调用都将贯穿整个{{1 }}语句:
when
也有class B {
inline operator fun <reified T : Any>getValue(thisRef: Any?, property: KProperty<*>): T {
return when(T::class.java){
SomeType::class.java -> SomeType() as T
SomeOtherType::class.java-> SomeOtherType() as T
else -> Unit as T
}
}
}
生成委托,但也限制为1个返回值。我认为目前尚没有一种优雅/受支持的方式来完成您所需的工作。