我试图理解这里的泛型,但我很挣扎.我有一个简单的代码
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
.我做错了什么?
我试图理解这里的泛型,但我很挣扎.我有一个简单的代码
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
的子类.我将返回该子类的一个实例."这个签名是一个谎言,因为您总是返回C()
,这是一个C
实例,而不是A
的所有T
个子类的T
.
仿制药建立了一种"面向所有人"的关系.调用方总是决定泛型实例化的对象,而不是被调用方.在你的情况下,你只需要返回A
.
fun changeVal() : A
你要使用的功能叫做存在主义类型,这在Kotlin中是不可用的.在Haskell(带有适当的编译器扩展)中,签名可能看起来像
data AContainer where
AVal :: forall a. a -> AContainer
changeVal :: AContainer
changeVal = ...
但Kotlin 没有这个功能.事实上,这正是OOP语言中的子类型所要做的:它说"我有一个具有这些特性的对象,但我不知道它的任何具体内容".所以你不需要泛型来表达这个模式.