ActionScript向量转换不一致?

时间:2012-05-23 14:28:06

标签: actionscript-3 vector casting

当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”。

为什么?不应该以某种方式存在一致的行为吗?

1 个答案:

答案 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的任何类型实例,并允许该函数返回您传入的相同矢量。