2009-02-28 306 views
9

嗨,我需要做一個VectorIterator,所以我需要接受任何類型的向量。我目前試圖將類型定義爲*像這樣:是否可以在Actionsctipt 3中定義泛型類型Vector?

var collection:Vector.<*> = new Vector<*>() 

但編譯器抱怨類型「不是編譯時間常量」。我知道一個bug與Vector類,其中的錯誤報告,報告的錯誤類型爲缺失,例如存在:

var collection:Vector.<Sprite> = new Vector.<Sprite>() 

如果雪碧未導入,編譯器會抱怨它不能找到Vector類。我想知道這是否相關?

+0

這是一個很好的問題。未知領域! – Iain 2009-02-28 19:53:16

回答

7

所以它看起來像答案是沒有辦法來隱式轉換的類型的載體爲有效超類型。它必須與全局矢量顯式執行。功能。

所以我實際問題是問題的混合:)

這是正確使用矢量。作爲一個通用的參考到另一個向量,但是,它不能像這樣進行:

var spriteList:Vector.<Sprite> = new Vector.<Sprite>() 
var genericList:Vector.<Object> = new Vector.<Object>() 
genericList = spriteList // this will cause a type casting error 

應利用全球向量()函數/施放,像這樣進行分配:

var spriteList:Vector.<Sprite> = new Vector.<Sprite>() 
var genericList:Vector.<Object> = new Vector.<Object>() 
genericList = Vector.<Object>(spriteList) 

這是一個簡單的例子,我沒有閱讀documentation

下面是一些測試代碼,我期待Vector。隱式投射到Vector。 < *>。

public class VectorTest extends Sprite 
{ 
    public function VectorTest() 
    { 
     // works, due to <*> being strictly the same type as the collection in VectorContainer 
     var collection:Vector.<*> = new Vector.<String>() 

     // compiler complains about implicit conversion of <String> to <*> 
     var collection:Vector.<String> = new Vector.<String>() 
     collection.push("One") 
     collection.push("Two") 
     collection.push("Three") 

     for each (var eachNumber:String in collection) 
     { 
      trace("eachNumber: " + eachNumber) 
     } 

     var vectorContainer:VectorContainer = new VectorContainer(collection) 

     while(vectorContainer.hasNext()) 
     { 
      trace(vectorContainer.next) 
     } 
    } 
} 

public class VectorContainer 
{ 
    private var _collection:Vector.<*> 

    private var _index:int = 0 

    public function VectorContainer(collection:Vector.<*>) 
    { 
     _collection = collection 
    } 

    public function hasNext():Boolean 
    { 
     return _index < _collection.length 
    } 

    public function get next():* 
    { 
     return _collection[_index++] 
    } 
} 
-1
var collection:Vector.<Object> = new Vector.<Object>() 

也許? 但我只是猜測,還沒有嘗試過。

+0

這會導致類型轉換錯誤。如果我創建一個向量。 並將它傳遞給我的迭代器,編譯器會抱怨鑄造一個Vector。 添加到矢量。 。 – 2009-03-01 10:10:09

+0

只是一個預感 - 嘗試聲明該方法接受一個向量(沒有類型參數) – 2009-03-02 08:39:04

+0

這是根據編譯器的非法語法。它至少期待Vector。 <*>() – 2009-03-03 08:53:30

-3
var collection:Vector.<Object> = new Vector.<Object>() 

但只針對Flash Player的10 CS4

+0

這會導致類型轉換錯誤。如果我創建一個向量。 並將它傳遞給我的迭代器,編譯器會抱怨鑄造一個Vector。 添加到矢量。 2009-03-01 10:17:58

0

我相信你可以只調用它Vector(無.<>

1
[Bindable] 
public var selectedItems:Vector.<Category>; 

public function selectionChange(items:Vector.<Object>):void 
{ 
    selectedItems = Vector.<Category>(items); 
} 
0

與Apache的Flex 4.11.0,你已經可以做你想做的是指非類型化的載體。它可能自4.9.0以來一直存在,但我之前沒有嘗試過。

相關問題