【问题标题】:Understanding function call priority between regular and generic versions了解常规版本和通用版本之间的函数调用优先级
【发布时间】:2016-01-18 18:39:06
【问题描述】:

在这段代码中:

class Foo {
}

func go(input: Foo) {
    print("Non-generic called")
}

func go<T>(input: T) {
    print("Generic called")
}

var foo:Foo = Foo()
go(foo) // Non-generic called

我只是好奇为什么调用非通用版本而不是通用版本?编译器是否只是优先考虑特定类型而不是泛型?

【问题讨论】:

标签: swift function generics


【解决方案1】:

编译器优先考虑最受约束的函数。因此,与需要子类型的where 子句匹配的函数将击败与需要超类型的where 子句匹配的函数。与where 子句匹配的函数将击败不匹配的函数。显式调用其类型的函数将击败仅匹配泛型的函数。具体规则非常复杂(在某些情况下似乎是a little ad hoc,当事情处于边缘时),但总体而言,这就是意图。

你可以把上面想成:

// Any T
func go<T>(input: T) {
    print("Generic called")
}

// A very constrained T, so clearly you wanted to override.
func go<T where T == Foo>(input: T) {
    print("Non-generic called")
}

【讨论】:

  • 第二个导致错误:相同类型的要求使泛型参数'T'非泛型。试试 func go(input: T) { print("Non-generic called") } 代替。
  • 正确;第二个不是合法的语法,但它代表了go(input: Foo) 的含义。
猜你喜欢
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 2021-08-10
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多