我如何在 Kotlin 中使用具有继承性的泛型

How can I use a Generics with inheritance in Kotlin

我想在这里理解泛型,但很挣扎。我有一个简单的代码,看起来像

interface A {
    
}

interface B {
    
}

class C : A, B {
    
}

fun <T: A> changeVal() : T {
    return C()
}

我收到以下错误 Type mismatch: inferred type is C but T was expected。我哪里错了?

您编写了一个函数,上面写着“给我命名为 A 的子类。我将 return 该子类的一个实例。”这个签名是一个谎言,因为你总是 return C(),这是一个 C 实例,而不是 [=12= 的所有 T 个子类的 T ].

泛型建立了一种“对所有人”的关系。调用者始终是决定泛型实例化对象的人,而不是被调用者。在你的情况下,你只是想 return A.

fun changeVal() : A

尝试使用的功能称为存在类型,它在 Kotlin 中不可用。在 Haskell 中(使用适当的编译器扩展),签名可能类似于

data AContainer where
  AVal :: forall a. a -> AContainer

changeVal :: AContainer
changeVal = ...

但是Kotlin没有这个功能。事实上,这正是 OOP 语言中的子类型化的目的:它说“我有一个具有这些功能的对象,但我对它一无所知”。所以你不需要泛型来表达这种模式。