将泛型类型转换为Any?

时间:2014-07-29 09:31:35

标签: generics swift

我有一个名为Box的类,其泛型参数为T

由于某些原因,它在Swift中无法将Box<String>(或任何其他类型)转换为Box<Any>

class Box<T> {}

var box: Box<Any>?
box = Box<String>() // 'String' is not identical to 'Any'

在Java中,有?代表任何类型。 (Box<?>

我可以在Swift中做什么?

2 个答案:

答案 0 :(得分:7)

简短回答是:无法Box<String>强制转换为Box<Any>,因为它们之间没有任何关系。

This page适用于Java,但也适用于

  

给定两种具体类型A和B(例如,数字和整数),MyClass&lt; A&gt;无论A和B是否相关,与MyClass&lt; B&gt;无关系。 MyClass的共同父母&lt; A&gt;和MyClass&lt; B&gt;是对象。

除非您明确定义关系。例如支持隐式转换运算符:

class Box<T> {
    func __conversion<U>() -> Box<U> {
        // do whatever required for conversion
        // try reinterpretCast if you can't make type system happy
        // which will give you runtime error if you do it wrong...
        return Box<U>()
    }
}

答案 1 :(得分:1)

首先,为什么您希望box变量属于Box<Any>类型,但要包含Box<String>的实例?

Swift是一种类型安全的语言,您无法为变量分配不同类型的对象。这很简单,你不能这样做:

var x: Float
x = 2 as Int

如果您希望Box实例与任何类的任何对象相关联,只需将其声明为:

var box = Box<AnyObject>?

您将拥有我认为您需要的box实例。

请参阅Swift中关于类型安全的此链接:https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_443

关于使用AnyAnyObject的问题:https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-XID_492

希望这有帮助,