Как сделать конкретный вторичный конструктор в Kotlin, когда первичным конструктором является generi c? - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь выяснить, как сделать вторичный конструктор для обобщенного c класса, чтобы я мог легко создать его версию по умолчанию. Этот код кажется мне разумным - вторичный конструктор вызывает основной с конкретным T: Table. Но компилятор, кажется, не распознает это, выдавая «Несоответствие типов: выведенный тип - Scratch_5.Furniture.table, но T был ожидаем» для вторичного конструктора.

sealed class Furniture {
    class NamedChair(name: String) : Furniture()
    object Table : Furniture()
}

class Blah<T : Furniture>(
    data: T
) {
    constructor() : this(Furniture.Table)
}

var blah = Blah(Furniture.Table)
var equalBlah = Blah()

Однако строка var blah = Blah(Furniture.Table) с использованием основного конструктора работает отлично. Есть ли что-то, что я здесь скучаю? Как бы я изменил это, чтобы оно работало?

1 Ответ

1 голос
/ 25 марта 2020

У вас не может быть конкретного вторичного конструктора, в то время как первичный имеет универсальный параметр c.

Однако вы можете добиться того же эффекта с помощью небольшого трюка, используя operator fun invoke() on Blah:

class Blah<T : Furniture>(data: T) {
  companion object {
    operator fun invoke(): Blah<Furniture.Table> = Blah(Furniture.Table)
  }
}

Или вы можете использовать fun с именем Blah (спасибо @AlexeyRomanov):

fun Blah(): Blah<Furniture.Table> = Blah(Furniture.Table)

Теперь вы можете успешно позвонить:

var blah = Blah(Furniture.Table)
// Calls the invoke operator fun which invokes the primary constructor.
var equalBlah = Blah()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...