2012-05-23 84 views
2

當矢量流延像這樣...ActionScript 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都指向同一個對象,跟蹤輸出都將是「富,酒吧」。

爲什麼?難道不應該有一貫的行爲嗎?

回答

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 

這是因爲,雖然字符串是對象的一個​​亞型,這兩種載體是not related.

那麼,爲什麼你的符號不會失敗?因爲你是真正做的是調用top level function Vector(),創建任何集合類型數據的載體,你傳遞什麼它的文件說:

如果sourceArray參數已經是一個Vector.<T>實例,其中T是基礎類型,該函數返回該Vector。否則,結果Vector將使用sourceArray Array或Vector的元素進行填充。

在你的類型聲明中的星號是一個佔位符,所以變量將持有任何類型的載體的實例,並允許該函數返回您在通過相同的載體。

+0

好了,所以它的更多的語法不一致。看起來像一個類型轉換,但沒有。頂層Vector()函數存在不一致性。認爲它應該總是返回一份。不管怎麼說,還是要謝謝你! :) – Morrandir