我有课程Alpha
和Berry
:
class Alpha { }
class Berry : Alpha { }
我有一个在其中使用继承的函数:
func myFunc<T : Alpha>(v:T) -> T {
return T()
}
我这样调用myFunc:
myFunc(Berry())
在我的项目中,返回的对象是Alpha
类型,而不是类型Berry
。这是编译器中的错误,或者这只是我对泛型的误解吗?
答案 0 :(得分:3)
您要实现的目标是传递Berry
的实例并获取Berry
的另一个实例?
如果是这样,以下代码应该有效:
class Alpha {
required init() { } // ← YOU NEED THIS
func printme() {
println("I'm alpha")
}
}
class Berry : Alpha {
override func printme() {
println("I'm berry")
}
}
func myFunc<T:Alpha>(v:T) -> T {
return v.dynamicType()
}
// This also works:
/*
func myFunc<T: Alpha>(v:T) -> T {
return (T.self as T.Type)()
}
*/
let a = myFunc(Berry())
a.printme() // -> I'm berry
required init() { }
是确保从Alpha
派生的所有类都具有init()
初始化程序所必需的。
这是相关的问答:Swift generics not preserving type
如果您要将Berry
作为类型传递并获取Berry
的新实例,请尝试以下操作:
class Alpha {
required init() { }
func printme() {
println("alpha")
}
}
class Berry : Alpha {
override func printme() {
println("berry")
}
}
func myFunc<T:Alpha>(v:T.Type) -> T {
return v()
}
let a = myFunc(Berry)
a.printme()