如何从泛型类<t>调用基类的静态方法?

时间:2016-06-06 21:07:12

标签: swift

我试图从通用子类中调用基类中的静态方法。请参阅下面的简化操场代码

调用非静态&#39;转储&#39;功能有效。 类似的静态调用失败。对阵列进行类型转换的各种尝试也都失败了。

在完整的生产代码中,&#34; ClassA&#34;是在第三方模块中,无法更改。它可以进一步细分和扩展。

Swift是否提供了一些神奇的类型转换让ClassT直接调用ClassA.dump()?

class ClassT<T> {

    var dict=[String:T]()

    func add(key:String, obj:T) {
        dict[key]=obj
        let arr=Array(dict.values)
        dump(arr) // works -> but not as expected, see comment below !!!
        ClassA.dump(arr) // error: cannot convert value of type 'Array<T>' to expected argument type '[ClassA]'
        ClassA.dump(arr as! [ClassA]) // error: cannot convert value of type 'Array<T>' to type '[ClassA]' in coercion
        ClassA.dump(arr as! [AnyObject]) // error: 'AnyObject' is not a subtype of 'T'
        ClassA.dump(arr as! [Any]) // error: 'Any' is not a subtype of 'T'
    }

}

class ClassA {

    func dump(arr:[ClassA]) {
        ClassA.dump(arr)
    }

    static func dump(arr:[ClassA]) {
        print(arr)
    }
}

class ClassB:ClassA {

    static let o=ClassT<ClassA>()

    func test() {
        ClassB.o.add("Elem1", obj:self)
    }
}

1 个答案:

答案 0 :(得分:3)

您必须添加约束以指定T来自ClassA

class ClassT<T: ClassA> {

    var dict = [String : T]()

    func add(key: String, obj: T) {
        dict[key] = obj
        let arr = Array(dict.values) //probably unecessary
        dump(arr) // works
        ClassA.dump(arr)
    }
    //...

如果没有它,编译器无法强制所有符合要求的类型T都可以转换为ClassA