Можно ли определить универсальный тип Vector в Actionsctipt 3? - PullRequest
9 голосов
/ 28 февраля 2009

Привет, мне нужно сделать VectorIterator, поэтому мне нужно принять Vector любого типа. В настоящее время я пытаюсь определить тип как * так:

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

Но компилятор жалуется, что тип "не является постоянной времени компиляции". я знаю, что существует ошибка с классом Vector, когда отчет об ошибках сообщает о неправильном типе как отсутствующем, например:

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

если Sprite не был импортирован, компилятор будет жаловаться, что не может найти класс Vector. Интересно, это связано?

Ответы [ 6 ]

7 голосов
/ 01 марта 2009

Таким образом, похоже, ответ заключается в том, что нет способа неявно привести вектор типа к допустимому супертипу. Это должно выполняться явно с глобальной функцией 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 () / приведение типа так:

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

Это был простой случай, когда я не читал документацию .

Ниже приведен тестовый код, я бы ожидал Вектор. неявно приводить к вектору. <*>.

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 голос
/ 20 октября 2011
[Bindable]
public var selectedItems:Vector.<Category>;

public function selectionChange(items:Vector.<Object>):void
{
    selectedItems = Vector.<Category>(items);
}
0 голосов
/ 05 ноября 2013

С Apache Flex 4.11.0 вы уже можете делать то, что хотите. Это могло быть там с 4.9.0, но я раньше не пробовал.

0 голосов
/ 02 марта 2009

Я полагаю, что вы можете обратиться к нетипизированному вектору, просто позвонив ему Vector (нет .<>)

0 голосов
/ 01 марта 2009
var collection:Vector.<Object> = new Vector.<Object>()

но только при таргетинге на флеш-плеер 10 cs4

0 голосов
/ 01 марта 2009
var collection:Vector.<Object> = new Vector.<Object>()

может быть? Но я просто размышляю, не пробовал.

...