Общие ограничения на один конструктор

Предположим, у меня есть общий класс:

class OrderedArray<T>( private val items: Array<T>, private val comparator: Comparator<in T> ) { constructor(items: Array<T>) : this(items, naturalOrder<T>()) } 

Конечно, этот код не компилируется, так как T не обязательно сопоставим. Существует ли доступная языковая конструкция, которая ограничивает общий параметр типа в конструкторе? Как я могу разрешить создание экземпляра моего класса без явной передачи компаратора, когда доступно естественное упорядочение?

Невозможно ввести общую конструкцию конструктора, поскольку конструкторы не имеют собственных общих параметров, они могут использовать только параметры класса.

Рассмотрим следующие обходные пути:

  • Одним из решений является создание подкласса с общей привязкой и использование его:

     class NaturallyOrderedArray<T: Comparable<T>>(items: Array<T>) : OrderedArray<T>(items, naturalOrder<T>()) 

    Но он выглядит неуклюжим ( напишите класс, чтобы переопределить общую привязку и ввести другой конструктор ?! ) и требует, чтобы родительский класс был open или, по крайней мере, sealed .

  • Вы можете сделать заводскую функцию с необходимой общей привязкой:

     fun <T: Comparable<T>> naturallyOrderedArray(items: Array<T>) = OrderedArray(items, naturalOrder<T>()) 

    Вы можете заставить функцию имитировать конструктор, чтобы он назывался как OrderedArray(items) , но лучше придерживаться последовательного наименования , которое также намекает на то, что используется естественный порядок.

Я бы написал пролив-вперед:

 class OrderedArray<T: Comparable<T>>( private val items: Array<T>, private val comparator: Comparator<in T> = naturalOrder<T>()) 

Решает ли проблема? Если нет, каковы ограничения для вашего дела?

  • Двухмерный общий поставщик массивов
  • Создать конкретный Java-класс, который использует рекурсивные дженерики в Котлине
  • Kotlin: общий метод и цикл для запроса итератора ()
  • Kotlin: Общая функция как возвращаемый тип?
  • Типы подстановок Java против звездной проекции Котлина
  • Как я могу называть класс java как A: extends B реализует C в kotlin
  • Общее литье в Котлине
  • Какой тип времени компиляции я должен назначить для получения возвращаемого значения java.util.Map <TextAttribute,?>
  • Резервирование проекции Котлина
  • Почему этот тип требует явного приведения?
  • Конструкция объявления Koltin Generic-site <a T>
  • Interesting Posts

    IntelliJ IDEA с использованием JavaScript-версии зависимости, указанной в файле сборки Gradle?

    Как создать экземпляр анонимного класса, который реализует интерфейс в Kotlin

    Как запустить класс Kotlin из командной строки?

    Kotlin: "val someVar = if (xx) 1 else 1.0", почему someVar является "Any"?

    kotlin coroutine throws java.lang.IllegalStateException: уже возобновлено, но получил значение Место

    Kotlin смешивается с ошибкой Java: не удается найти символ

    Невозможно создать прослушиватель событий Spring Data в Котлине

    UnsupportedOperationException Команда «android» больше не включена в SDK

    Kotlin и Spring Data JPA создает PropertyReferenceException

    Kotlin: Как я могу позволить Android Studio реализовать интерфейс в нижней части класса

    Как «добавить» символ в строку в Котлин

    Android: кнопка на фрагменте

    Если isConnected возвращает true, почему Exeption говорит, что он не подключен?

    Фрагмент isDetached условный не запускается, хотя фрагмент, безусловно, отсоединен

    Как остановить службу уведомления на Android Oreo

    Давайте будем гением компьютера.