【问题标题】:Casting generic class inside generic function seems to change inference of type parameter在泛型函数中转换泛型类似乎会改变类型参数的推断
【发布时间】: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 的调用中推断为FooBar,但我希望在这两种情况下都可以推断为相同的东西,因为类型参数的推断应该只在签名和调用码,两种情况下签名和调用码相同。

T.self 应该已经是T.Type 类型,所以转换它应该是一个空操作(事实上,编译器甚至不应该允许转换,因为它应该总是正确的)。然而,通过执行这个演员,我似乎正在改变我正在调用初始化程序的类。转换对象不应该改变对象的值如果它成功了,所以这真的很奇怪。

【问题讨论】:

    标签: class generics swift metaclass type-parameter


    【解决方案1】:

    现在有一个thread on this in the dev forums。最相关的部分基本上表明这是 Swift 参数类型系统的结果:

    Swift 的类型系统是参数化的,这意味着泛型函数或类型在其泛型类型参数上的行为相同,而不是像 C++ 那样基于替换。 [...] 在像 Swift 这样的参数系统中,泛型函数只需进行一次类型检查和编译,因为行为不会因每种类型而改变,并且泛型可以跨编译单元边界使用。

    该线程中有更多的探索和解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-01
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      相关资源
      最近更新 更多