Можно ли обеспечить несколько типов делегатов одним классом? - PullRequest
0 голосов
/ 28 июня 2018

Я хотел бы предоставить несколько разных делегатов из одного класса с разными типами. Например:

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 голосов
/ 28 июня 2018

Единственный способ получить его для компиляции и запуска, хотя я настоятельно рекомендую не использовать его, кроме проверки концепции, поскольку 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 возвращаемым значением. Я не думаю, что есть элегантный / поддерживаемый способ сделать то, что вам нужно прямо сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...