0

ベクトルの型としてオブジェクトまたは*を使用しても、一般的な機能(Javaのリストなど)は提供されません。目撃者:

public static function someGenericVectorUtil (value:Vector.<*>) :void {
    // do stuff to/with the Vector
}

var someVector:Vector.<Number>;
someGenericVectorUtil(someVector);  // compile-time implicit coercion error

したがって、おそらく、配列を受け入れるようにユーティリティメソッドを再定義します。しかし、ユーティリティに入るベクトルを配列に変換する簡単な方法も、後でそれらをパックする簡単な方法もありません。その結果、次のようなコードになります。

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

この混乱を正す方法はありますか?または、汎用ユーティリティを使用してベクターを実行する必要があると思われる場合は、ベクターの使用を停止する必要がありますか?(明らかに、あまりオプションではありません...)

4

2 に答える 2

3
public static function someGenericVectorUtil (value:Vector.<*>) :void {
    // do stuff to/with the Vector
}

var someVector:Vector.<Number>;
someGenericVectorUtil(Vector.<*>(someVector));

^それは動作します。アレイも試してみてください。

于 2012-04-25T22:43:16.807 に答える
1

これは答えではありませんが、@ Lukaszの答えに対するより長いコメントです。

彼の答えの問題は、実際には新しいベクターを作成しているため、ベクターを返してsomeGenericVectorUtil再キャストする必要があることです。例:

var v:Vector.<int> = Vector.<int>([1,2,3]); 
trace( v == Vector.<int>( Vector.<*>( v ) ) ); // traces false

このコードは単純な の Vector を作成し、intsそれをキャストされたバージョンのそれ自体と比較します (最初に にキャストし*、次に に戻しますint)。ベクトルをトレースすると、トレースは同じになりますが、実際のベクトル参照自体は同じオブジェクトではありません。したがって、ベクトルを変更するユーティリティ関数 (シャッフルやランダム化関数など) がある場合、何も変わりません。

例えば:

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"

ご覧のとおり、最後に向かって少し醜くなり始めます。他の場所でベクターを追跡している場合は、参照を更新する必要がありますが、これが私がこれまでに見つけた唯一の解決策です。 :S

于 2013-03-25T18:39:05.830 に答える