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

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

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

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

Intereting Posts
lateinitVar не может быть разрешено использовать isInitialized от Kotlin 1.2.10 Kotlin 'до' забавного создания мусора IntRange Получить дату из DatePickerDialog в Kotlin Android Ошибка «Function0 не является функциональным интерфейсом» при передаче java lambda в kotlin fun Kotlin загружает внешний класс? Запустить службу в фоновом режиме Поплавковый примитив магически становится 0 при использовании для запуска PointF или RectF в Kotlin Android Какой из них лучший объект или верхняя функция в Котлине? Невозможно предоставить квалифицированную строку с помощью Dagger2 Статический импорт методов Kotlin Companion? Ошибка выполнения с помощью ListView в Android с Kotlin? Общий код между сервером Kotlin и клиентскими проектами с использованием Gradle Откуда берутся три тестовых контейнера? Исключение: blockingConnect не следует вызывать в потоке пользовательского интерфейса, несмотря на то, что я добавил другой поток Как перевести Array <T?> В список <T>?