Почему у меня нет доступа к элементам класса generi c? - PullRequest
0 голосов
/ 20 апреля 2020

Я создал обобщенную c функцию в Kotlin, в которой я хочу создать экземпляр обобщенного c типа.

interface TickerEntity{

  val tickers: Array<String>
  val fee: Double
  val bid : Double
  val ask : Double

}

  inline fun < reified T : TickerEntity> getStockBuySell() {

    val tickerEntity:Class<T> = T::class.java

  }

TickerEntity - это интерфейс. Я намереваюсь создать экземпляры классов, которые реализуют это

Функция выше - это своего рода работа, НО у меня нет доступа к элементам каждого класса. Также кажется, что конструктор ни один из них не инициирован.

Мой вопрос: как правильно создать экземпляр интерфейса в приведенном выше примере? Я хочу иметь доступ к каждому элементу класса.

1 Ответ

2 голосов
/ 20 апреля 2020

Чтобы создать его экземпляр, вы можете вызвать newInstance() для класса Java, при условии, что у него есть конструктор с нулевым аргументом:

inline fun < reified T : TickerEntity> getStockBuySell() {
    val tickerEntity : T = T::class.java.newInstance()
    // ...
}

Это не удастся, если у класса нет конструктор с нулевым аргументом.

Вы можете рассмотреть возможность использования конструктора в качестве аргумента вашей функции.

fun <T : TickerEntity> getStockBuySell(entityConstructor: () -> T) {
    val tickerEntity : T = entityConstructor()
    // ...
}

// Usage:
getStockBuySell(::MyTickerEntityImplementationClass)

При использовании выше все еще требуется конструктор с нулевым аргументом, но если у вас есть некоторые специальная реализация, которая нуждается в аргументах, вы можете передать их через лямбду:

getStockBuySell { MyTickerEntityImplementationClass("someConstructorArgument") }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...