2009-02-28 17 views
9

Hi tôi cần phải thực hiện một VectorIterator, vì vậy tôi cần phải chấp nhận một Vector với bất kỳ loại nào. Tôi hiện đang cố gắng xác định loại như * như vậy:Có thể xác định kiểu Vector chung trong Actionsctipt 3 không?

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

Nhưng trình biên dịch phàn nàn rằng loại "không phải là hằng số biên dịch". tôi biết một lỗi tồn tại với lớp Vector nơi báo cáo lỗi, báo cáo các loại sai như mất tích, ví dụ:

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

nếu Sprite đã không được nhập khẩu, trình biên dịch sẽ phàn nàn rằng nó không thể tìm thấy những lớp Vector. Tôi tự hỏi nếu điều này có liên quan?

+0

Đó là một câu hỏi hay. Uncharted lãnh thổ! – Iain

Trả lời

7

Vì vậy, có vẻ như câu trả lời là không có cách nào để ngầm cast một Vector của một loại để loại siêu hợp lệ. Nó phải được thực hiện một cách rõ ràng với Vector toàn cầu. <> chức năng.

Vì vậy, tôi thực tế vấn đề là một kết hợp của các vấn đề :)

Đó là đúng để sử dụng Vector. như một tài liệu tham khảo tổng quát để một Vector, nhưng, nó không thể được thực hiện như thế này:

var spriteList:Vector.<Sprite> = new Vector.<Sprite>() 
var genericList:Vector.<Object> = new Vector.<Object>() 
genericList = spriteList // this will cause a type casting error 

Việc chuyển nhượng phải được thực hiện bằng cách sử dụng Vector() chức năng toàn cầu/đúc như vậy:

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

Đó là một trường hợp đơn giản của tôi không đọc số documentation.

Dưới đây là một số mã thử nghiệm, tôi mong đợi Vector. để đúc hoàn toàn với 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

Đây là hàm tạo vòng lặp VectorIterator (bộ sưu tập: Vector.) và đây là cách tạo ra giao diện: var spriteList: Vector. = Vector mới. () var iterator: VectorIterator = new VectorIterator (Vector. (spriteList)) khá xấu xí :) –

+0

Điều này có nghĩa là không có cách nào để giữ lại gõ? I E. có một VectorIterator. hoặc VectorIterator. > ... – bzlm

+0

yep, theo như tôi biết. Generics không phải là một phần của đặc tả ngôn ngữ ECMA, vì vậy không có cách nào để tôi định nghĩa một lớp với một kiểu generic. Tôi có thể sử dụng lớp Vector, nhưng đó là nhiều hơn một mức độ trình biên dịch hack như xa như tôi có thể nói. –

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

có thể? Nhưng tôi chỉ đang suy đoán, chưa thử.

+0

Điều này gây ra lỗi truyền kiểu. Nếu tôi tạo một Vector. và chuyển nó vào Iterator của tôi, trình biên dịch phàn nàn về việc đúc một Vector. đến Vector. . –

+0

Chỉ cần một linh cảm - hãy thử khai báo phương thức như chấp nhận một Vector (không có tham số kiểu) –

+0

Đó là cú pháp bất hợp pháp theo trình biên dịch. nó ít nhất là mong đợi Vector. <*>() –

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

nhưng chỉ trên nhắm mục tiêu flash player 10 cs4

+0

Điều này gây ra lỗi truyền kiểu. Nếu tôi tạo một Vector. và chuyển nó vào Iterator của tôi, trình biên dịch phàn nàn về việc đúc một Vector. đến Vector.

0

Tôi tin rằng bạn có thể tham khảo một Vector untyped bởi chỉ gọi đó là Vector (không .<>)

+0

Đó là cú pháp bất hợp pháp theo trình biên dịch. nó ít nhất là mong đợi Vector. <*>() –

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

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

Với Apache Flex 4.11.0, bạn đã có thể làm những gì bạn muốn. Nó có thể đã có từ 4.9.0, nhưng tôi đã không thử điều đó trước đây.