Swift中泛型类的子类化失败

Swift中泛型类的子类化失败,swift,generics,swift3,Swift,Generics,Swift3,我对泛型编程相当陌生,对Swift 3和泛型类的子类化有问题。我把这一切都归结为一个简单的失败案例,希望有人能帮助解释我为什么会失败 使用以下协议和类,一切都可以正常工作。这是可行的(我的真实代码还有很多,但效果很好): 协议P{ 关联T型 } 类Temp{} C1类{ init(tmp:Temp){} } 但是,当我将子类划分为以下子类时: class C2<L:P> : C1<L> {} C2类:C1{} 我发现编译器失败: <unknown>:0:

我对泛型编程相当陌生,对Swift 3和泛型类的子类化有问题。我把这一切都归结为一个简单的失败案例,希望有人能帮助解释我为什么会失败

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

协议P{
关联T型
}
类Temp{}
C1类{
init(tmp:Temp){}
}
但是,当我将子类划分为以下子类时:

class C2<L:P> : C1<L> {}
C2类:C1{}
我发现编译器失败:

<unknown>:0: error: expression type 'Temp<_>' is ambiguous without more context
:0:错误:表达式类型“Temp”不明确,没有更多上下文
错误不在特定行上,而是出现在编译器活动日志中的故障

也许我遗漏了一些简单的东西,但我就是看不到。我的子类与基类具有相同的约束(也就是说,它必须采用协议P),因此在我看来这应该是可行的


有什么想法吗?

我首先说,我不明白你的问题为什么会发生,但我希望这能对你有所帮助

让我们从
C1
类开始

class C1<D: P> {}
最后,如果覆盖
C2
类中的
init
,代码最终将编译。
我认为这实际上可能是一个编译器问题,我会尝试为此提交一份雷达文件。实际上,我不知道还可以尝试什么。

问题似乎出在其他地方。此问题中包含的代码编译没有问题(使用Swift 3.1)。很可能是
Temp
实例的泛型
X
与预期的类型
D.T
不匹配,或者在实例化
C1
C2
时没有指定泛型类型(
让foo=C2(tmp:someValue)
@Palle不知道你在哪里试过,因为在操场上(Swift 3.1)它没有编译我试图修复你的错误,但我觉得一切都很好。我只注意到,通过注释init或在子类中重写它,它开始编译。看起来编译器无法理解
D.T
类型这看起来像个bug–代码不是在Swift 3.0.2中编译的,而是在Swift 3.1中编译的。@LucaD'Alberti我在REPL中尝试了它,并使用了一个我使用
swiftc
Thank you@Luca!重写
init
确实解决了这个问题,尽管我同意编译器中一定有一些bug。我的特定用例有点复杂,为参数创建一个具有不同名称的新init解决了问题问题
class C1<D: P> {}
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) {
    }
}