我有一个名为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中做什么?
答案 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
关于使用Any
和AnyObject
的问题:https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html#//apple_ref/doc/uid/TP40014097-CH22-XID_492
希望这有帮助,