Swiftgenerics在使用inheritance时不会实例化generics
我有classAlpha
和Berry
:
class Alpha { } class Berry : Alpha { }
我有一个函数,在它的generics中使用inheritance:
func myFunc<T : Alpha>(v:T) -> T { return T() }
我打电话给myFunc:
myFunc(Berry())
在我的项目中,返回的对象是Alpha
types,而不是Berry
types。 这是编译器中的一个错误,或者这只是我误解generics的东西?
你想要实现的是通过一个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()
初始值设定项。 这里是相关的Q / A: Swift非保存types的generics
如果你想要传递Berry
作为一个types并获得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()