如何处理GenericClass <any>进行抽象

时间:2019-05-30 00:09:57

标签: ios swift generics

我试图弄清楚如何将用不同类型实例化的泛型一起用作抽象。例如,将它们放在一个数组中或将它们传递给函数。我知道这很棘手,因为对象在编译时需要一个具体的类。但是,在尝试使用具体类时,我偶然发现了下面的操场代码。即使将类实例化为Generic1<Any>,也可以正确识别基础value属性的类型。所以我的奥秘在于:即使type(of: g1.value)Inttype(of:g1)怎么能成为Generic1<Any>?既然如此,为什么我不能将g1强制转换为Generic1<Int>?谢谢!

class Generic1<T> {
    var value: T
    init(_ value:T) {
        self.value = value
    }
}

func handleGeneric(_ g: Generic1<Any>) {
    print("--------------------")
    print(type(of:g))
    print(type(of:g.value))
    print(g.value)
    print("--------------------")
}


let g1 = Generic1<Any>(1)
let g2 = Generic1<Any>("hello")

handleGeneric(g1)
handleGeneric(g2)

输出

--------------------
Generic1<Any>
Int
1
--------------------
--------------------
Generic1<Any>
String
hello
--------------------

1 个答案:

答案 0 :(得分:1)

  

即使cf.setClientReconnectOptions(WMQConstants.WMQ_CLIENT_RECONNECT); cf.setClientReconnectTimeout(1800); // how long in seconds to continue to attempt reconnection before failing type(of: g1.value)Int仍是type(of:g1)

Generic1<Any>使用运行时类型信息(存储在type(of:)实例使用的现有容器中)为您提供具体的类型。我认为它不能返回超类,协议或除具体类型之外的任何东西。 Any的具体类型为g1.valueInt的具体类型为g1

  

为什么我不能将Generic<Any>投射到g1

因为Swift的泛型不是协变的。也就是说,即使Generic1<Int>C<A>的子类型,C<B>也不是A的子类型。参见https://stackoverflow.com/a/30487474/3141234