Как получить «это» из generic в kotlin

#kotlin

#kotlin

Вопрос:

Я хотел бы создать функцию по умолчанию для интерфейса с общим атрибутом, и для этого мне нужно получить значение «this» как значение класса T, а не Responsable< T > .

 interface Responsable<T> {
    fun toResponseModel(assembler: RepresentationModelAssembler<T, EntityModel<T>>): EntityModel<T> {
        return assembler.toModel(this)
    }
}
 

На самом деле, «это» является экземпляром Responsabe . Что я должен сделать, чтобы передать параметр T class?

Комментарии:

1. Чего именно вы пытаетесь достичь здесь? Не могли бы вы показать примеры использования интерфейса и метода, которые вы пытаетесь объявить?

Ответ №1:

Если вы хотите объявить функцию, которая работает с любым T , который также является a Responsable<T> , возможно, было бы лучше объявить ее как функцию расширения для таких T s:

 interface Responsable<T>

fun <T : Responsable<T>> T.toResponseModel(assembler: RepresentationModelAssembler<T, EntityModel<T>>): EntityModel<T> {
    return assembler.toModel(this)
}
 

Ответ №2:

Вот как я решил эту проблему

 interface Responsable<T> {
    fun toResponseModel(assembler: RepresentationModelAssembler<T, EntityModel<T>>): EntityModel<T> {
        return assembler.toModel(this as T)
    }
}
 

Комментарии:

1. Это довольно небезопасно, нет причин Responsable<T> также быть T . Что, если вы объявите class Dog : Responsable<Cat> ?

2. Итак, как это сделать безопасно? Я имею в виду, как объявить, что класс, реализующий этот интерфейс, также должен быть T?

3. Я предложил решение в своем ответе. Я считаю, что он делает то, что вы хотите, но не стесняйтесь комментировать, если это не решит вашу проблему