我试图从通用子类调用基类中的静态方法。请参阅下面的简化 Playground 代码。
调用非静态“转储”函数有效。 类似的静态调用失败。对数组进行类型转换的各种尝试也失败了。
在完整的生产代码中,“ClassA”位于第 3 方模块中,无法更改。它可以进一步子类化和扩展。
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)
}
}
最佳答案
您必须添加一个约束来指定 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
。
关于swift - 如何从泛型类<T>调用基类上的静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37666917/