【问题标题】:How to handle GenericClass<Any> for abstraction如何处理 GenericClass<Any> 进行抽象
【发布时间】:2019-05-30 00:09:56
【问题描述】:

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

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
--------------------

【问题讨论】:

    标签: ios swift generics


    【解决方案1】:

    即使type(of:g1) 是Generic1&lt;Any&gt;,type(of: g1.value) 怎么可能是 Int

    type(of:) 使用运行时类型信息(存储在Any 实例使用的存在容器中)为您提供具体类型。我认为它永远不会返回超类、协议或除具体类型之外的任何东西。 g1.value的具体类型是Int,g1的具体类型是Generic&lt;Any&gt;。

    为什么我不能将g1 转换为Generic1&lt;Int&gt;

    因为 Swift 的泛型不是协变的。也就是说,C&lt;A&gt; 不是C&lt;B&gt; 的子类型,即使A 是B 的子类型。见https://stackoverflow.com/a/30487474/3141234

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      相关资源
      最近更新 更多