2

当像这样投射矢量时......

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

为什么?不应该有某种一致的行为吗?

4

1 回答 1

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 的子类型,但两种向量是不相关的。

那么为什么你的符号没有失败呢?因为你真正在做的是调用顶层函数Vector(),它从你传入的任何集合类型数据创建一个向量。它的文档说:

如果 sourceArray 参数已经是Vector.<T>T 是基本类型的实例,则该函数返回该 Vector。否则,结果 Vector 将使用 sourceArray Array 或 Vector 的元素填充。

类型声明中的星号是占位符,因此变量将保存 Vector 的任何类型化实例,并且允许函数返回您传入的相同向量。

于 2012-05-23T15:05:42.337 回答