泛型类作为关联类型

时间:2016-11-28 19:33:05

标签: swift generics

当我这样做时:

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) {}
}

编译得很好。

0 个答案:

没有答案