在Swift中对泛型类进行子类化失败

时间:2017-03-10 06:15:22

标签: swift generics swift3

我对通用编程很新,我遇到了Swift 3的问题并且继承了泛型类。我把这一切都剥夺了一个简单的案例,但是我希望有人可以帮助解释我为什么会失败。

使用以下协议和类,一切正常。这是有效的(我的真实代码有很多工作,但工作正常):

protocol P {
  associatedtype T
}

class Temp<X> {}
class C1<D:P> {
  init(tmp: Temp<D.T>) {}
}

但是,当我按如下方式进行子类化时:

class C2<L:P> : C1<L> {}

我的编译失败了:

<unknown>:0: error: expression type 'Temp<_>' is ambiguous without more context

错误不在特定行上,而是出现在编译器活动日志中的失败。

也许有一些我想念的简单,但我只是看不到它。我的子类与基类具有相同的约束(也就是说,它必须采用协议P),所以在我看来这应该有效。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我首先说我无法弄清楚为什么你的问题正在发生,但我希望这可以帮助你某种方式

让我们从C1班开始。

class C1<D: P> {}

通过使用它,一切正常。所以我想确保通用参数可以在C1C2中使用,实际上它可以

class C1<D: P> {
    // it compiles
    let something: D.T? = nil

    // it compiles
    func doSomething(using parameter: D.T) {
    }

    // do not compile
    init(_ some: D.T) {
    }
}

最后,如果覆盖init类中的C2,代码最终会编译。 我认为它实际上可能是一个编译器问题,我会尝试为此提交雷达。我实际上还不知道还有什么可以尝试。