是否可以在Actionscript 3中定义泛型类型Vector?

时间:2009-02-28 17:45:08

标签: flex actionscript-3 vector generics

嗨我需要制作一个VectorIterator,所以我需要接受任何类型的Vector。我目前正在尝试将类型定义为*,如此:

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

但编译器抱怨类型“不是编译时常量”。我知道错误报告的Vector类存在一个错误,报告错误的错误类型,例如:

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

如果没有导入Sprite,编译器会抱怨它无法找到Vector类。我想知道这是否相关?

6 个答案:

答案 0 :(得分:7)

所以看起来答案是没有办法隐式地将类型的Vector转换为有效的超类型。必须使用全局Vector明确执行它。&lt;&gt;功能

所以我的实际问题是一系列问题:)

使用Vector是正确的。作为另一个Vector的通用引用,但是,它不能像这样执行:

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

应该使用全局Vector()函数/ cast来执行赋值,如下所示:

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

这是一个简单的例子,我没有阅读documentation

下面是一些测试代码,我期待Vector。隐式转换为Vector。&lt; *&gt;。

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 :(得分:1)

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

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

答案 2 :(得分:0)

我相信你可以通过调用它来引用无类型的Vector Vector(没有.<>

答案 3 :(得分:0)

使用Apache Flex 4.11.0,您已经可以执行所需的操作。它可能一直存在于4.9.0以来,但我之前没有尝试过。

答案 4 :(得分:-1)

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

可能? 但我只是猜测,没试过。

答案 5 :(得分:-3)

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

但仅适用于定位Flash播放器10 cs4