【发布时间】:2017-01-08 10:13:41
【问题描述】:
这是一个示例游乐场:
protocol P {
associatedtype T
func getValue() -> T
}
class Foo: P {
func getValue() -> String {
return "hello"
}
}
class Bar {
func test<T: P>(_ o: T) {
print("Generic", o.getValue())
}
func test(_ o: Any) {
print("Any")
}
}
let foo = Foo()
let bar = Bar()
bar.test(foo)
这个输出:Any。
如果我删除 test 的 Any 版本,则会调用泛型方法。
Foo 类符合 P 协议,为什么 Swift 不选择泛型方法,因为它更具体?有没有办法调用通用的?
【问题讨论】:
-
嗯,最简单的解决方案是使
test(_:)的Any重载通用——即func test<T>(_ o: T)(虽然不确定这是否直接回答了你的问题)。 -
在这种情况下,泛型方法并不具体。
test(_ o: Any)的参数是Any的具体类型 之一(即使类型本身是协议),它可以成功包装Foo实例作为其参数。任何具体类型都将比泛型类型更具体,在调用bar.test(...)时,前者将在重载决议中优先。您通常应该避免使用Any作为具体类型,并且更好的方法是 subst。使用上面@Hamish 描述的非约束泛型(在这种情况下,约束泛型将更具体)。
标签: swift generics overloading