通用列表实用程序可以使用向量(AS3)吗?

时间:2012-04-25 22:17:24

标签: arrays actionscript-3 list generics vector

使用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.
}

有什么方法可以理顺这个烂摊子?或者,当我认为我可能需要通过通用实用程序运行它时,我应该停止使用向量? (显然,也没有多少选择......)

2 个答案:

答案 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