2011-03-10 65 views
0

我希望能夠通過Vectors作爲參考。現在,如果方法採用Vector.<Object>,則傳遞Vector.<TRecord>(其中TRecord直接從Object繼承)不起作用。凡方法只需要簡單對象;說vec: Object,然後傳遞矢量是可能的。一旦進入此方法,需要在某個階段進行明確的演員才能再次訪問vec作爲Vector。不幸的是,一個演員似乎做了一個副本,這意味着在多個Flex ListCollectionView中包裝一個是無用的;每個ListCollectionView將指向一個不同的Vector。傳遞矢量。 <T>引用作爲對象,鑄造造成副本

在ArrayCollection中使用數組並沒有出現這樣的問題,但是我失去了Vector的安全性,整潔性(代碼應該足夠乾淨以避免吃掉)和性能優勢。

有沒有一種方法可以將它們作爲參考以通用的方式進行轉換或傳遞,而不會沿途複製?在這個例子中,IRecord是一個與{r/w id:int & name:String}屬性的接口,但它可以是一個類,比如TRecord {id:int;名稱:字符串}或任何其他可用的類型。

protected function check(srcVec: Object): void 
{ 
    if (!srcVec) { 
    trace("srcVec is null!"); 
    return; 
    } 
    // srcVec = (@b347e21) 
    trace(srcVec.length); // 4, as expected 
    var refVec: Vector.<Object> = Vector.<Object>(srcVec); 
    // refVec = (@bc781f1) 
    trace(refVec.length); // 4, ok, but refVec has a different address than srcVec 
    refVec.pop(); 
    trace(refVec.length); // 3 ok 
    trace(srcVec.length); // 4 - A copy was clearly created!!! 
} 

protected function test(): void 
{ 
    var vt1: Vector.<IRecord> = new Vector.<IRecord>; // (@b347e21) - original Vector address 
    var vt2: Vector.<Object> = Vector.<Object>(vt1); // (@bbb57c1) - wrong 
    var vt3: Vector.<Object> = vt1 as Vector.<Object>; // (@null) - failure to cast 
    var vt4: Object = vt1;        // (@b347e21) - good 
    for (var ix: int = 0; ix < 4; ix++) 
    vt1.push(new TRecord); 
    if (vt1) trace(vt1.length); // 4, as expected 
    if (vt2) trace(vt2.length); // 0 
    if (vt3) trace(vt3.length); // vt3 is null 
    if (vt4) trace(vt4.length); // 4 
    if (vt1) trace(Vector.<Object>(vt1).length); // 
    trace("calling check(vt1)"); 
    check(vt1); 
} 

回答

4

這是不可能的。如果類型T與U類型協變,那麼任何T的容器都不與U類型的容器協同工作。C#和Java使用內置的數組類型做了這一點,並且他們的設計者希望他們可以返回並剪掉它。

考慮,如果這個代碼是合法的

var vt1: Vector.<IRecord> = new Vector.<IRecord>; 
var vt3: Vector.<Object> = vt1 as Vector.<Object>; 

現在我們有一個Vector.<Object>。但是等等,如果我們有一個Objects對象的容器,那麼我們當然可以在其中粘貼一個對象 - 對嗎?

vt3.push(new Object()); 

但WAIT - 因爲它實際上是的Vector.<IRecord>一個實例,你不能做到這一點,即使的Vector.<Object>合同中明確說,你可以插入Object。這就是爲什麼這種行爲顯然是不允許的。

編輯:當然,你的框架可能允許它成爲一個非可變引用這樣,這安全。但是我沒有使用ActionScript的經驗,並且無法驗證它是否確實如此。

+0

感謝DeadMG的迴應。所以它純粹是一個接口的問題與Object類不相容?無關:As3確實允許我將實現IRecord接口的對象推送到Vector中。 雖然。爲了簡單起見,我將使用Vector。 ;可能不是那麼幹淨,但是我可以使用一個包裝器集合來處理適當的投射(如果需要的話)本身。我本來希望能夠創建一個通用的Vector集合,但它看起來有問題。儘管這可以用一些技巧來實現。 as3是一種非常靈活的語言。 – Atorian 2011-03-13 12:58:16