2009-02-28 149 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以来一直存在,但我之前没有尝试过。

相关问题