在你的下方,我会看到一个操场,我试图说明我的问题。我有一个类(Foo
)和一些重载的泛型方法(bar<T>()
),其返回类型取决于泛型参数。我有3种方法:
BaseClass
)Array
个实例。当我调用该方法时会出现问题。即使我告诉编译器我期望的类型是什么,它也会给我错误 Ambiguos使用bar()。
import UIKit
class BaseClass {
required init() {}
}
class Foo {
// 1
func bar<T: BaseClass>() -> T? {
// Just a default implementation, it should do real work inside
return T()
}
// 2
func bar<T: BaseClass>() -> [T]? {
// Just a default implementation, it should do real work inside
return []
}
// 3
func bar<T>() -> T? {
// Just a default implementation, it should do real work inside
return "Test" as? T
}
}
let foo = Foo()
// Should call "1", because it return type is BaseClass
let baseClassObject: BaseClass? = foo.bar()
// Should call "2", because it return type is [BaseClass]
let baseClasArray: [BaseClass]? = foo.bar()
// Should call "3", because it return type is neither BaseClass nor [BaseClass]
let anyOtherObject: String = foo.bar()
在我看来,编译器应该知道调用什么方法,因为我告诉它返回类型,对吧?这是泛型的限制还是我错过了什么?
提前致谢。
4月19日更新
在答案中他们说冲突是因为&#34; BaseClass&#34;可以解释为BaseClass
,也可以解释为T
。但是在这个修改过的游乐场中,编译器确实推断出哪种方法正确使用。有什么区别吗?我在这里应该有同样的冲突吗?:
import UIKit
class BaseClass {
required init() {}
}
class Foo {
// 1
func bar<T: BaseClass>(param: T) -> String {
return "I am BaseClass"
}
// 2
func bar<T: BaseClass>(param: [T]) -> String {
return "I am [BaseClass]"
}
// 3
func bar<T>(param: T) -> String {
return "I am other thing"
}
}
let foo = Foo()
// It prints "I am BaseClass"
foo.bar(BaseClass())
// It prints "I am [BaseClass]"
foo.bar([BaseClass(), BaseClass()])
// It prints "I am another thing"
foo.bar(NSObject())
答案 0 :(得分:2)
3号引起与其他功能的冲突
这是因为&lt; T>也可以是BaseClass类型和[BaseClass]类型。编译器只是看到&#34;在这里抛出任何东西的接口&#34;这将与任何更具体的特异性水平相冲突。