是否可以通过一个类提供多个委托类型?

时间:2018-06-27 22:17:13

标签: android kotlin kotlin-delegate

我想从一个类中提供多个不同类型的不同委托。例如:

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

是否可以通过某种方式指定泛型类型参数,以便实现这一目标?

1 个答案:

答案 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个返回值。我认为目前尚没有一种优雅/受支持的方式来完成您所需的工作。