我试图从通用子类中调用基类中的静态方法。请参阅下面的简化操场代码
调用非静态'转储'功能有效。 类似的静态调用失败。对阵列进行类型转换的各种尝试也都失败了。
在完整的生产代码中," ClassA"是在第三方模块中,无法更改。它可以进一步细分和扩展。
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)
}
}
答案 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
。