Общий расширяемый класс с сопутствующим объектом в Котлине

Я пишу следующий код, но он не работает, потому что я получаю неразрешенную ошибку ссылки .

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 может получить общий тип класса.

Надеюсь, это поможет вам.