使用Object或*作为Vector的类型不提供通用功能(如Java中的List)。证人:
public static function someGenericVectorUtil (value:Vector.<*>) :void {
// do stuff to/with the Vector
}
var someVector:Vector.<Number>;
someGenericVectorUtil(someVector); // compile-time implicit coercion error
所以,也许我们重新定义实用程序方法来接受一个数组。但是没有简单的方法可以将进入实用程序的Vector转换为Arrays,也不是一种简单的方法可以将它们打包回来,导致代码如下:
public static function someGenericArrayUtil (value:Array) :void {
// do stuff to/with the formerly-known-as-Vector
}
var someVector:Vector.<Number>;
var tempArray:Array = new Array(someVector.length);
for (var i:uint=0; i<someVector.length; i++) {
tempArray[i] = someVector[i];
}
someGenericVectorUtil(tempArray);
someVector = Vector.<Number>([tempArray]);
毋庸置疑,这很可怕。好的,让我们将Vector-Array-Vector废话移动到实用程序中:
public static function vectorToArray (Vector.<*>) :Array {
// oh wait....that Vector.<*> param is useless,
// as demonstrated earlier.
}
有什么方法可以理顺这个烂摊子?或者,当我认为我可能需要通过通用实用程序运行它时,我应该停止使用向量? (显然,也没有多少选择......)
答案 0 :(得分:3)
public static function someGenericVectorUtil (value:Vector.<*>) :void {
// do stuff to/with the Vector
}
var someVector:Vector.<Number>;
someGenericVectorUtil(Vector.<*>(someVector));
^它有效。也可以尝试使用Array。
答案 1 :(得分:0)
这不是一个答案,而是对Lukasz答案的长篇评论。
他回答的问题是你实际上是在创建一个新的Vector,所以你需要从someGenericVectorUtil
返回Vector并重新投射它。例如。试试:
var v:Vector.<int> = Vector.<int>([1,2,3]);
trace( v == Vector.<int>( Vector.<*>( v ) ) ); // traces false
该代码只创建一个简单的ints
向量,然后将其与自身的版本进行比较(首先是*
,然后再回到int
)。如果你追踪向量,它们将跟踪相同,但实际的向量引用本身不是同一个对象。因此,如果你有一个修改Vector的效用函数(例如一个shuffle或randomise函数),那么什么都不会改变。
E.g:
var v:Vector.<int> = Vector.<int>([1,2,3]);
trace( v ); // traces "1,2,3"
// shuffle() randomises the elements in a vector - this first call won't work
// as the cast creates a new vector
VectorUtil.shuffle( Vector.<*>( v ) );
trace( v ); // traces "1,2,3"
// we need to recast it back, and change shuffle() to return the vector
v = Vector.<int>( VectorUtil.shuffle( Vector.<*>( v ) ) );
trace( v ); // traces "3,1,2"
正如你所看到的那样,它开始变得有点难看,如果你在其他任何地方跟踪Vector,你需要更新引用,但它是我唯一的解决方案到目前为止发现:S