当我这样做时:
class GenericClass<T> {}
protocol Protocol {
associatedtype A
associatedtype C : GenericClass<A>
}
class IntClass : GenericClass<Int> {}
struct Adopter : Protocol {
typealias A = Int
typealias C = IntClass
}
一切都很好
但是如果我向使用Protocol
关联类型的C
添加方法:
protocol Protocol {
...
func f(c: C)
}
并在Adopter
中实施:
struct Adopter : Protocol {
...
func f(c: C) {}
}
一切都刹车了!编译器告诉我:
&#34;协议需要功能&#39;使用(c :)和#39;使用类型&#39;(Adopter.C) - &gt; ()&#39; ...&#34;
我最好的猜测是,这与C是一个类的事实有关,而且类型签名f(c:C)将允许C的子类被传递,但我不知道那会是怎样的是一个问题...
这里有一个gist,说明了您可以粘贴到游乐场的问题
我想知道这是不是一个错误?我希望我不会*再次*从根本上误解类型系统的东西
我认为我只是通过声明这样的协议来解决问题的根源:
protocol Protocol {
associatedtype A
associatedtype C : GenericClass<A>
func f(c: C)
}
将它放入游乐场,我收到错误:
游乐场执行失败:错误:通用参数&#39; C&#39;不能是GenericClass&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;错误类型&gt;&gt;&gt;&#39;和&#39; GenericClass&#39;
只是因为,我尝试使用结构模仿类似的类型关系:
struct Struct<
A,
C : GenericClass<A>
> {
func f(c: C) {}
}
编译得很好。