Swiftgenerics在使用inheritance时不会实例化generics

我有classAlphaBerry

 class Alpha { } class Berry : Alpha { } 

我有一个函数,在它的generics中使用inheritance:

 func myFunc<T : Alpha>(v:T) -> T { return T() } 

我打电话给myFunc:

 myFunc(Berry()) 

在我的项目中,返回的对象是Alphatypes,而不是Berrytypes。 这是编译器中的一个错误,或者这只是我误解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()