【问题标题】:Is it possible to define a generic type Vector in Actionsctipt 3?是否可以在 Actionscript 3 中定义泛型类型 Vector?
【发布时间】:2009-02-28 17:45:08
【问题描述】:

您好,我需要制作一个 VectorIterator,所以我需要接受任何类型的 Vector。我目前正在尝试将类型定义为 *,如下所示:

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

但是编译器抱怨该类型“不是编译时常量”。我知道 Vector 类存在一个错误,错误报告将错误类型报告为缺失,例如:

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

如果没有导入 Sprite,编译器会抱怨找不到 Vector 类。我想知道这是否相关?

【问题讨论】:

  • 这是个好问题。未知领域!

标签: apache-flex actionscript-3 vector generics


【解决方案1】:

所以看起来答案是没有办法将类型的 Vector 隐式转换为有效的超类型。必须使用全局 Vector. 函数显式执行。

所以我的实际问题是混合问题:)

使用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)

这是我没有阅读documentation的一个简单案例。

下面是一些测试代码,我希望是 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++]
    }
}

【讨论】:

  • 这是迭代器构造函数 VectorIterator(collection:Vector.) 以及创建的样子: var spriteList:Vector. = new Vector.() var iterator: VectorIterator = new VectorIterator(Vector.(spriteList)) 很丑:)
  • 这是否意味着无法保留输入? IE。有一个 VectorIterator. 或 VectorIterator.>...
  • 是的,据我所知。泛型不是 ECMA 语言规范的一部分,因此我无法定义具有泛型类型的类。我可以使用 Vector 类,但据我所知,这更像是编译器级别的黑客攻击。
  • @Brian - AVM 原生支持向量。我没有看过它们是如何定义的,但它们的引用方式绝对是独一无二的。请参阅我的自我回答问题 - stackoverflow.com/questions/553445/…
  • 感谢 Richard,很高兴看到 Vectors 是如何实现的,希望泛型能很快成为语言的一部分,以及一个体面的 as3mock 代理系统,让你的模拟变得更容易: D
【解决方案2】:
[Bindable]
public var selectedItems:Vector.<Category>;

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

【讨论】:

    【解决方案3】:

    我相信您可以通过将其称为 Vector(不是 .&lt;&gt;)来引用无类型向量

    【讨论】:

    • 编译器认为这是非法的语法。它至少期望 Vector.()
    【解决方案4】:

    使用 Apache Flex 4.11.0,您已经可以为所欲为。它可能从 4.9.0 开始就存在,但我之前没有尝试过。

    【讨论】:

      【解决方案5】:
      var collection:Vector.<Object> = new Vector.<Object>()
      

      也许? 但我只是推测,还没有尝试过。

      【讨论】:

      • 这会导致类型转换错误。如果我创建一个 Vector. 并将其传递给我的迭代器,编译器会抱怨将 Vector. 转换为 Vector..
      • 只是预感 - 尝试将方法声明为接受 Vector(没有类型参数)
      • 编译器认为这是非法的语法。它至少期望 Vector.()
      【解决方案6】:
      var collection:Vector.<Object> = new Vector.<Object>()
      

      但仅针对 Flash Player 10 cs4

      【讨论】:

      • 这会导致类型转换错误。如果我创建一个 Vector. 并将其传递给我的迭代器,编译器会抱怨将 Vector. 转换为 Vector.
      猜你喜欢
      • 2011-09-15
      • 2016-10-19
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 2017-04-11
      • 2023-04-10
      相关资源
      最近更新 更多