Я пишу следующий код, но он не работает, потому что я получаю неразрешенную ошибку ссылки .
class Chromosome { constructor() {} companion object { fun newInstance(): Chromosome { return Chromosome() } } } class Population<T>(size: Int) where T: Chromosome { var population: Array<T> = Array(size, { _ -> T.newInstance() }) }
Я хочу, чтобы общий тип T расширяет определенный класс или интерфейс. Мне нужно вызвать статические заводские методы, потому что я не могу написать T()
в конструкторе класса Array . Есть ли способ обернуть класс Array, вызывающий конструктор по умолчанию?
Я пробовал с другим подходом, но он все еще не работает. На этот раз я получаю Can Can not use 'T' в качестве параметра типа reified. Вместо этого используйте класс вместо ошибки.
class Population<T>(size: Int, init: () -> T) where T: Chromosome { var population: Array<T> = Array(size, { _ -> init() }) }
Тип Array
действует так же, как массив в Java . Поэтому он особенный и не работает с дженериками. Вместо этого вы должны использовать подход Java List
. Это означает использование MutableList
в Котлине .
class Population<T: Chromosome>(size: Int, factory: () -> T) { var population = MutableList(size, { factory() }) }
Также убедитесь, что Chromosome
реализован как открытый или абстрактный класс. В противном случае вам не нужно будет генерировать популяцию, а подход Array
снова будет работать.
Вы можете попробовать свой класс Population
качестве кода, как показано ниже:
class Population<T : Class<*>>(size: Int) where T: Chromosome { ... }
Используя вышеприведенный код, ваш класс Population
может получить общий тип класса.
Надеюсь, это поможет вам.