鉴于以下类型
protocol AProtocol {}
protocol AnotherProtocol {}
class AClass: AProtocol, AnotherProtocol {}
我有点困惑为什么以下引发:"错误:无法转换类型的值' AClass'指定类型' T'"
class generic<T> where T:AProtocol, T:AnotherProtocol {
let prop: T = AClass()
}
但以下工作正常:
class generic<T> where T: AProtocol, T: AnotherProtocol {
let prop: T
init(withProp prop: T) { self.prop = prop }
}
let instance = generic<AClass>(withProp: AClass())
答案 0 :(得分:4)
您班级的通用参数由您班级的用户指定,而不是您。
你不能像你在第一个没有编译的代码片段中那样T
AClass
,因为T
是由用户指定的。您班级的用户可能需要以下内容:
let myObject = generic<BClass>()
其中BClass
也满足约束条件。那么当用户试图访问该属性时会发生什么?他将获得AClass
的实例,但T
实际上是BClass
,所以他应该得到BClass
。看到这里的矛盾?
关于你的评论:
换句话说,不可能从泛型类的实现中引用泛型类型的实现?
确切地说,因为你不知道那些类型会是什么。您可以调用在AProtocol
和AnotherProtocol
中声明的方法。通用约束确保存在这些方法。
如果你想让它以你想要的方式运作,你需要所谓的协议组合:
var someProperty: (AProtocol & AnotherProtocol) = AClass()