【发布时间】:2015-01-12 12:09:34
【问题描述】:
我有一个奇怪的情况,通过将泛型函数中的 T.self 更改为 T.self as T.Type,它会更改代码的语义:
class Foo {
required init() {}
}
class Bar : Foo {
}
func f<T: Foo>(_:T) -> T {
return T.self()
}
println(f(Bar())) // prints MyProject.Foo
但是
class Foo {
required init() {}
}
class Bar : Foo {
}
func f<T: Foo>(_:T) -> T {
return (T.self as T.Type)()
}
println(f(Bar())) // prints MyProject.Bar
这没有意义。代码使用T.self 创建T 类的实例。尽管T 在这两种情况下都可以在对f 的调用中推断为Foo 或Bar,但我希望在这两种情况下都可以推断为相同的东西,因为类型参数的推断应该只在签名和调用码,两种情况下签名和调用码相同。
T.self 应该已经是T.Type 类型,所以转换它应该是一个空操作(事实上,编译器甚至不应该允许转换,因为它应该总是正确的)。然而,通过执行这个演员,我似乎正在改变我正在调用初始化程序的类。转换对象不应该改变对象的值如果它成功了,所以这真的很奇怪。
【问题讨论】:
标签: class generics swift metaclass type-parameter