Как наследовать интерфейс от дженериков в Kotlin? - PullRequest
1 голос
/ 07 апреля 2019

У меня, как говорят, есть PersonImpl<Base : IPerson> обобщенный класс, где IPerson - это интерфейс Person.Я пытаюсь сделать это

interface IPerson {
    fun getName(): String
}

interface IPoliceMan : IPerson {
    fun getDepartmentName(): String
}

open class PersonImpl<T: IPerson>(private val name: String) : T

, а затем

class PoliceMan(private val departmentName: String, name: String) : PersonImpl<IPoliceMan>(name)

Поэтому я хочу, чтобы компилятор сказал, что мне нужно реализовать getDepartmentName() в PoliceMan, но это не таквозможно как Только классы и интерфейсы могут служить супертипами

Таким образом, единственный вариант подобен этому

class PoliceMan(private val departmentName: String, name: String) : IPoliceMan, PersonImpl<IPoliceMan>(name)

с дублированием интерфейса.

Могу ли я иметь общий супертип в Kotlin (или Java)?

PS Если это невозможно, есть ли механизм эмуляции этого поведения?

1 Ответ

0 голосов
/ 07 апреля 2019

Я не думаю, что для этого вам нужны дженерики, просто реализация интерфейсов.

interface IPerson { // "HasName"
    val name: String
}

interface IPoliceMan : IPerson { // "HasDepartmentName"
    val departmentName: String
}

open class Person(
    override val name: String
) : IPerson

class PoliceMan(
    override val departmentName: String, 
    name: String
) : Person(name), IPoliceMan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...