【发布时间】:2017-03-10 06:15:22
【问题描述】:
我对泛型编程相当陌生,并且在使用 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),所以在我看来这应该可行。
有什么想法吗?
【问题讨论】:
-
看起来问题出在其他地方。这个问题中包含的代码编译没有问题(使用 Swift 3.1)。您可能在
Temp实例的泛型类型X与预期类型D.T之间不匹配,或者您在C1或C2的实例化时未指定泛型类型 (@987654329 @. -
@Palle 不知道你在哪里试过,因为在操场上(Swift 3.1)它不能编译
-
我试图修复您的错误,但对我来说一切都很好。我只注意到通过注释 init 或在子类中覆盖它,它开始编译。看起来编译器无法找出
D.T类型 -
这看起来像一个错误——代码不能在 Swift 3.0.2 中编译,但在 Swift 3.1 中可以。
-
@LucaD'Alberti 我在 REPL 中进行了尝试,并使用了我使用
swiftc编译的文件