如何从 Kotlin 中的泛型继承接口?

Dav*_*ian 5 java generics inheritance kotlin

据说我有PersonImpl<Base : IPerson>泛型类,IPersonPerson 的接口在哪里。我正在尝试这样做

interface IPerson {
    fun getName(): String
}

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

open class PersonImpl<T: IPerson>(private val name: String) : T
Run Code Online (Sandbox Code Playgroud)

进而

class PoliceMan(private val departmentName: String, name: String) : PersonImpl<IPoliceMan>(name)
Run Code Online (Sandbox Code Playgroud)

所以,我希望编译器说,我需要实现 getDepartmentName()PoliceMan,但这是不可能的,因为只有类和接口可作为超类型

所以唯一的变种是这样的

class PoliceMan(private val departmentName: String, name: String) : IPoliceMan, PersonImpl<IPoliceMan>(name)
Run Code Online (Sandbox Code Playgroud)

与界面重复。

我可以在 Kotlin(或 Java)中有泛型超类型吗?

PS 如果不可能,是否有任何机制可以模拟这种行为?

Epi*_*rce 0

我认为您不需要泛型,只需实现接口即可。

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
Run Code Online (Sandbox Code Playgroud)

  • 我同意你不能在 Kotlin 中做到这一点。在C++中(据我所知),泛型是用模板实现的,因此每个实例化都可以有不同的超类。而在 Kotlin(和 Java)中,泛型是使用类型擦除来实现的;就运行时而言,只有一个类,因此它只能有一个超类。 (2认同)