Можно ли обеспечить несколько типов делегатов одним классом?
Я хотел бы предоставить несколько разных делегатов из одного класса с разными типами. Например:
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 ответ
Единственный способ получить его для компиляции и запуска, хотя я настоятельно рекомендую не использовать его, кроме проверки концепции, так как inline будет генерировать много мусорного кода, и каждый getValue
звонок пройдет через весь 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
}
}
}
Есть также operator fun provideDelegate
это генерирует делегатов, но оно также ограничено 1 возвращаемым значением. Я не думаю, что есть элегантный / поддерживаемый способ сделать то, что вам нужно прямо сейчас.