2009-02-28 7 views
9

हाय मुझे एक वेक्टर इटरेटर बनाने की ज़रूरत है, इसलिए मुझे किसी भी प्रकार के वेक्टर को किसी भी प्रकार से स्वीकार करने की आवश्यकता है। मैं वर्तमान में तो जैसे के रूप में प्रकार * परिभाषित करने के लिए कोशिश कर रहा हूँ:क्या एक्शनक्लिट 3 में एक सामान्य प्रकार वेक्टर परिभाषित करना संभव है?

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

लेकिन संकलक शिकायत कर रहा है कि प्रकार "एक संकलन समय स्थिर नहीं है"। मुझे पता है एक बग वेक्टर वर्ग जहां त्रुटि रिपोर्टिंग, गलत प्रकार की रिपोर्ट लापता, उदाहरण के लिए के रूप में के साथ मौजूद है:

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

अगर स्प्राइट आयात नहीं किया था, संकलक शिकायत करेगा कि यह वेक्टर वर्ग नहीं मिल रहा। मुझे आश्चर्य है कि यह संबंधित है?

+0

यह एक अच्छा सवाल है। अज्ञात क्षेत्र! – Iain

उत्तर

7

तो यह जवाब की तरह लग रहा है पर कोई रास्ता नहीं करने के लिए परोक्ष वैध सुपर प्रकार करने के लिए एक प्रकार का एक वेक्टर डाली है। यह वैश्विक वेक्टर के साथ स्पष्ट रूप से किया जाना चाहिए। <> फ़ंक्शन।

तो मेरी वास्तविक समस्या समस्याओं का मिश्रण :)

यह वेक्टर उपयोग करने के लिए सही है था। एक और वेक्टर के लिए एक सामान्य संदर्भ, लेकिन जैसा कि यह इस प्रकार नहीं किया जा सकता:

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 नहीं पढ़ रहा है।

नीचे कुछ परीक्षण कोड है, मैं वेक्टर की अपेक्षा करता हूं। वेक्टर को निहित रूप से डालने के लिए। < *>।

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

यहां इटरेटर कन्स्ट्रक्टर वेक्टर इटरेटर (संग्रह: वेक्टर।) और यहां यह है कि निर्माण कैसे दिखता है: var spriteList: वेक्टर। = नया वेक्टर। () वर इटरेटर: VectorIterator = नए VectorIterator (वेक्टर (spriteList)।) बहुत बदसूरत :) –

+0

इस का कोई तरीका नहीं टाइपिंग बनाए रखने के लिए है इसका मतलब यह है? अर्थात। एक वेक्टर इटरेटर है। या वेक्टर इटरेटर। <वेक्टर। > ... – bzlm

+0

हाँ, जहां तक ​​मुझे पता है। जेनेरिक ईसीएमए भाषा की कल्पना का हिस्सा नहीं हैं, इसलिए एक सामान्य प्रकार के साथ कक्षा को परिभाषित करने का कोई तरीका नहीं है। मैं वेक्टर वर्ग का उपयोग कर सकता हूं, लेकिन जहां तक ​​मैं कह सकता हूं कि एक कंपाइलर स्तर हैक का अधिक है। –

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

शायद? लेकिन मैं बस अनुमान लगा रहा हूं, कोशिश नहीं की है।

+0

यह एक प्रकार कास्टिंग त्रुटि का कारण बनता है। अगर मैं एक वेक्टर बनाते हैं। और इसे मेरे इटरेटर में पास करें, संकलक एक वेक्टर कास्टिंग करने के बारे में शिकायत करता है। एक वेक्टर के लिए । –

+0

बस एक झुकाव - विधि को वेक्टर को स्वीकार करने के रूप में घोषित करने का प्रयास करें (बिना किसी प्रकार के पैरामीटर के) –

+0

यह संकलक के अनुसार अवैध वाक्यविन्यास है। यह कम से कम वेक्टर की अपेक्षा करता है। <*>() –

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

लेकिन केवल लक्षित कर फ़्लैश प्लेयर 10 CS4

+0

यह एक प्रकार कास्टिंग त्रुटि का कारण बनता है। अगर मैं एक वेक्टर बनाते हैं। और इसे मेरे इटरेटर में पास करें, संकलक एक वेक्टर कास्टिंग करने के बारे में शिकायत करता है। एक वेक्टर के लिए

0

मेरा मानना ​​है कि आप इसे Vector (कोई .<>)

+0

पर देखें, यह संकलक के अनुसार अवैध वाक्यविन्यास है। यह कम से कम वेक्टर की अपेक्षा करता है। <*>() –

1
[Bindable] 
public var selectedItems:Vector.<Category>; 

public function selectionChange(items:Vector.<Object>):void 
{ 
    selectedItems = Vector.<Category>(items); 
} 
0

अपाचे फ्लेक्स 4.11.0 के साथ, आप पहले से ही आप क्या चाहते हैं कर सकते हैं फोन करके एक untyped वेक्टर देख सकते हैं। यह 4.9.0 के बाद से हो सकता है, लेकिन मैंने पहले कोशिश नहीं की है।

संबंधित मुद्दे

 संबंधित मुद्दे