我试图弄清楚如何将用不同类型实例化的泛型一起用作抽象。例如,将它们放在一个数组中或将它们传递给函数。我知道这很棘手,因为对象在编译时需要一个具体的类。但是,在尝试使用具体类时,我偶然发现了下面的操场代码。即使将类实例化为Generic1<Any>
,也可以正确识别基础value属性的类型。所以我的奥秘在于:即使type(of: g1.value)
是Int
,type(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
--------------------
答案 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.value
,Int
的具体类型为g1
。
为什么我不能将
Generic<Any>
投射到g1
因为Swift的泛型不是协变的。也就是说,即使Generic1<Int>
是C<A>
的子类型,C<B>
也不是A
的子类型。参见https://stackoverflow.com/a/30487474/3141234