return 类型问题导致的方法重载
Method overloading by return type issue
我在使用泛型重载方法时出现意外行为:
func wrapper<T>() -> T? {
print(T.self)
let result: T? = internalFunc()
return result
}
func internalFunc<T>() -> T? {
print("generic")
return nil
}
func internalFunc() -> Int? {
print("non generic")
return nil
}
let s: Int = internalFunc() ?? 0
let s2: Int = wrapper() ?? 0
控制台输出:
non generic
Int
generic
我不明白为什么最后调用的方法是通用的。不应该动态选择过载吗?如果是这样,我们可以看到 T.self == Int.self
,并且应该调用非泛型方法。我哪里错了?
在Swift,"Overloaded functions are chosen at compile time".
这意味着您在 wrapper
中对 internalFunc()
的调用将始终分派到通用版本,因为编译器无法专门化它。
关于 airspeedvelocity 的整个系列文章都值得一读——它有助于澄清我对超载的理解。例如,本文的下一部分将讨论使用 类 上的方法而不是未绑定的函数来获得运行时多态性。
我在使用泛型重载方法时出现意外行为:
func wrapper<T>() -> T? {
print(T.self)
let result: T? = internalFunc()
return result
}
func internalFunc<T>() -> T? {
print("generic")
return nil
}
func internalFunc() -> Int? {
print("non generic")
return nil
}
let s: Int = internalFunc() ?? 0
let s2: Int = wrapper() ?? 0
控制台输出:
non generic
Int
generic
我不明白为什么最后调用的方法是通用的。不应该动态选择过载吗?如果是这样,我们可以看到 T.self == Int.self
,并且应该调用非泛型方法。我哪里错了?
在Swift,"Overloaded functions are chosen at compile time".
这意味着您在 wrapper
中对 internalFunc()
的调用将始终分派到通用版本,因为编译器无法专门化它。
关于 airspeedvelocity 的整个系列文章都值得一读——它有助于澄清我对超载的理解。例如,本文的下一部分将讨论使用 类 上的方法而不是未绑定的函数来获得运行时多态性。