当Vector像这样投射时......
var v1:Vector.<String> = new Vector.<String>();
v1.push("foo");
var v2:Vector.<Object> = Vector.<Object>(v1)
v1.push("bar");
trace(v1); //foo,bar
trace(v2); //foo
...创建了Vector的副本,如跟踪输出中所示。
但是当你将第3行改为......
时var v2:Vector.<*> = Vector.<*>(v1)
...没有创建副本,v1和v2都指向同一个对象,跟踪输出都是“foo,bar”。
为什么?不应该以某种方式存在一致的行为吗?
答案 0 :(得分:1)
您必须意识到Vector.<Something>(Vector.<Anotherthing>)
不是类型转换。实际上,你根本无法将一种矢量转换为另一种矢量!试试这个:
var v1:Vector.<String> = new Vector.<String>();
var v2:Vector.<Object> = v1 as Vector.<Object>; // throws an error
您也无法指定子类型的矢量:
var v1:Vector.<Object> = new Vector.<String>(); // throws an error
那是因为String是Object的子类型,这两种向量是not related.
那么为什么你的符号不会失败呢?因为你真正在做的是调用top level function Vector()
,它会从你传入的任何集合类型数据中创建一个向量。它的文档说:
如果sourceArray参数已经是
Vector.<T>
实例,其中T是基类型,则该函数返回该Vector。否则,结果Vector将填充sourceArray数组或Vector的元素。
类型声明中的星号是一个占位符,因此该变量将保存Vector的任何类型实例,并允许该函数返回您传入的相同矢量。