2012-05-23 2 views
2

Когда вектор отливают, как это ...Непоследовательность кастомизации ActionScript Vector?

var v1:Vector.<String> = new Vector.<String>(); 
v1.push("foo"); 

var v2:Vector.<Object> = Vector.<Object>(v1) 

v1.push("bar"); 

trace(v1); //foo,bar 
trace(v2); //foo 

... копия вектора создается, как вы можете видеть в трассировке.

Но когда вы меняете линию 3 к ...

var v2:Vector.<*> = Vector.<*>(v1) 

... копия не создается, как v1 и v2 указывают на тот же объект, трассировки выводит оба будут «Foo, Bar».

Зачем? Разве не должно быть последовательного поведения?

ответ

1

Что вы должны понять, так это то, что Vector.<Something>(Vector.<Anotherthing>) не относится к типу. На самом деле вы не можете отличить вектор одного вида от вектора другого вида вообще! Попробуйте это:

var v1:Vector.<String> = new Vector.<String>(); 
var v2:Vector.<Object> = v1 as Vector.<Object>; // throws an error 

Вы также не можете назначить вектор подтипов:

var v1:Vector.<Object> = new Vector.<String>(); // throws an error 

Это потому, что в то время как строка является подтипом объекта, два вида векторов not related.

Итак, почему ваши нотации не сработают? . Потому что то, что вы действительно делаете вызов top level function Vector(), который создает вектор из любых данных типа коллекции вы передаете в документации к ней говорит:

Если аргумент sourceArray уже Vector.<T> случай, когда T является базовым type, функция возвращает этот вектор. В противном случае результат Vector заполняется элементами исходного массива Array или Vector.

Звездочка в вашем объявлении типа является держателем места, так что переменная будет держать любой печатный экземпляр Vector, и что позволяет функция возвращает тот же вектор, который вы передаёте в.

+0

Ok, так что более синтаксическая несогласованность. Похоже на тип, но это не так. И есть несогласованность в функции верхнего уровня Vector(). Думайте, что он всегда должен возвращать копию. Спасибо, в любом случае! :) – Morrandir

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