" Ambiguos使用功能"在Swift中重载泛型函数时

时间:2016-04-18 21:05:46

标签: swift generics overloading

在你的下方,我会看到一个操场,我试图说明我的问题。我有一个类(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())

1 个答案:

答案 0 :(得分:2)

3号引起与其他功能的冲突

这是因为&lt; T>也可以是BaseClass类型和[BaseClass]类型。编译器只是看到&#34;在这里抛出任何东西的接口&#34;这将与任何更具体的特异性水平相冲突。