2009-02-28 4 views
9

Привет, мне нужно создать VectorIterator, поэтому мне нужно принять вектор с любым типом. Я в настоящее время пытаюсь определить тип, как * например так:Можно ли определить общий тип Vector в Actionctipt 3?

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

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

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

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

+0

Это отличный вопрос. Неизведанная территория! – Iain

ответ

7

Так выглядит как ответ там нет никакого способа неявно вектора типа для действительного типа суперкласса. Он должен выполняться явно с глобальным вектором. <> функция.

Так что мой фактическая проблема была смесь проблем :)

Это правильно использовать 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 

Назначение должно быть выполнено с помощью функции глобального вектора()/литой, как так:

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

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

Ниже приведено несколько тестовых кодов, я бы ожидал 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++] 
    } 
} 
+0

Вот итератор конструктор VectorIterator (коллекция: Вектор.) и вот как выглядит создание: var spriteList: Vector. = новый Векторный. () вар итератора: VectorIterator = новый VectorIterator (Vector (spriteList).) довольно некрасиво :) –

+0

Означает ли это, что нет никакого способа, чтобы сохранить печатать? То есть имеют VectorIterator. или VectorIterator. <Вектор. > ... – bzlm

+0

yep, насколько я знаю. Дженерики не являются частью спецификации языка ECMA, поэтому мне не удастся определить класс с общим типом. Я могу использовать класс Vector, но, насколько я могу судить, это скорее взлом на уровне компилятора. –

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

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

+0

Это вызывает ошибку разливки типа. Если я создаю вектор. и передать его моему Итератору, компилятор жалуется на литье вектора. Векторная иллюстрация. . –

+0

Просто догадка - попробуйте объявить метод как принятие вектора (без параметров типа) –

+0

Это незаконный синтаксис в соответствии с компилятором. он, по крайней мере, ожидает Vector. <*>() –

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

но только на нацеливание Flash Player 10 cs4

+0

Это вызывает ошибку разливки типа. Если я создаю вектор. и передать его моему Итератору, компилятор жалуется на литье вектора. Векторная иллюстрация.

0

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

+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, но я раньше этого не пробовал.

Смежные вопросы