2009-06-05 5 views

Répondre

4

Réponse courte est d'essayer grapefrukt's answer et voir.

Cependant, je ne pense pas que ce soit possible au niveau du bytecode. Le problème lié à la façon dont les génériques (vecteurs) sont construits. Fondamentalement, le bytecode pour créer une instance de Vector <> va:

GenericDefinitionType (Vector) + GenericParameter (int) -> GenericType 
Coerce (cast) GenericType as KnownGenericType (eg. "Vector.<int>") 

La question est donc pas dans la création, puisque GenericParameter est juste un multiname (qui peut être dynamique). Le problème est dans la coercition au type de vecteur connu (actuellement enregistré comme "Vector < int>" par exemple) puisqu'il n'y a pas de type de vecteur connu.

Voir mon article sur how Vectors work in bytecode pour les détails geek.

+0

Ah, je vois ce que tu veux dire. Merci! – fenomas

-1

Ce n'est pas testé, mais je ne vois pas pourquoi il ne devrait pas travailler:

import flash.display.Sprite; 
import flash.utils.getDefinitionByName; 

var ClassReference:Class = getDefinitionByName("flash.display.Sprite") as Class; 
var v:Vector.<ClassReference> = new Vector.<ClassReference>(); 
+0

Huh? Cela fait exactement la même chose que le code d'exemple non fonctionnel dans ma question, sauf avec Sprite au lieu de String. – fenomas

0

J'ai trouvé un moyen de créer dynamiquement des vecteurs. Au lieu de passer le type de classe que vous passez le vecteur entier comme classe, comme:

public function createVector (vectorType:Object):Object 
{ 
    return new vectorType(); 
} 

var v:Vector.<String> = createVector(Vector.<String>); 

Ou vous pouvez copier un vecteur comme ceci:

public function getCopy (ofVector:Object):Object 
{ 
    var copy:Object = new ofVector.constructor; 

    return copy; 
} 
Questions connexes