Можно ли определить общий тип Vector в Actionsctipt 3?
Привет, мне нужно создать VectorIterator, поэтому мне нужно принять вектор любого типа. В настоящее время я пытаюсь определить тип как * вот так:
var collection:Vector.<*> = new Vector<*>()
Но компилятор жалуется, что тип «не является постоянной времени компиляции». Я знаю, что в классе Vector существует ошибка, при которой в отчете об ошибке указывается, что неверный тип отсутствует, например:
var collection:Vector.<Sprite> = new Vector.<Sprite>()
если Sprite не был импортирован, компилятор пожаловался бы, что не может найти класс Vector. Интересно, связано ли это?
Ответов (6)6
Итак, похоже, что ответ заключается в том, что нет способа неявно привести вектор типа к действительному супертипу. Это должно выполняться явно с помощью глобальной функции 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 () следующим образом:
var spriteList:Vector.<Sprite> = new Vector.<Sprite>()
var genericList:Vector.<Object> = new Vector.<Object>()
genericList = Vector.<Object>(spriteList)
Это был простой случай, когда я не читал документацию .
Ниже приведен тестовый код, я бы ожидал, что 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++]
}
}