Apache flex 是否可以在Actionsctipt 3中定义泛型类型向量?
嗨,我需要做一个向量计算器,所以我需要接受任何类型的向量。我目前正在尝试将类型定义为*类似于:Apache flex 是否可以在Actionsctipt 3中定义泛型类型向量?,apache-flex,actionscript-3,vector,generics,Apache Flex,Actionscript 3,Vector,Generics,嗨,我需要做一个向量计算器,所以我需要接受任何类型的向量。我目前正在尝试将类型定义为*类似于: var collection:Vector.<*> = new Vector<*>() var集合:向量新向量() 但是编译器抱怨类型“不是编译时常量”。我知道Vector类中存在一个错误,错误报告将错误类型报告为缺失,例如: var collection:Vector.<Sprite> = new Vector.<Sprite>() var集合:
var collection:Vector.<*> = new Vector<*>()
var集合:向量新向量()
但是编译器抱怨类型“不是编译时常量”。我知道Vector类中存在一个错误,错误报告将错误类型报告为缺失,例如:
var collection:Vector.<Sprite> = new Vector.<Sprite>()
var集合:向量新向量。()
如果未导入Sprite,编译器会抱怨找不到Vector类。我想知道这是否相关?var collection:Vector.=新向量。()
var collection:Vector.<Object> = new Vector.<Object>()
也许吧?
但我只是猜测,还没有尝试过。var-collection:Vector.=新向量。()
var collection:Vector.<Object> = new Vector.<Object>()
但仅针对FlashPlayer10CS4,所以答案似乎是无法将类型的向量隐式转换为有效的超级类型。它必须使用全局向量显式执行。功能 所以我的实际问题是一系列问题:) 使用向量是正确的。作为对另一个向量的一般引用,但不能这样执行:
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.=新向量。()
var genericList:Vector.=新向量。()
genericList=SpritList//这将导致类型转换错误
应使用全局向量()函数/cast执行赋值,如下所示:
var spriteList:Vector.<Sprite> = new Vector.<Sprite>()
var genericList:Vector.<Object> = new Vector.<Object>()
genericList = Vector.<Object>(spriteList)
var spriteList:Vector.=新向量。()
var genericList:Vector.=新向量。()
genericList=向量(spriteList)
这是一个我不看报纸的简单例子
下面是一些测试代码,我希望是矢量。隐式转换为向量
public类VectorTest扩展了Sprite
{
公共功能向量测试()
{
//由于与VectorContainer中的集合类型完全相同,因此可以正常工作
变量集合:向量。=新向量。()
//编译器抱怨将数据隐式转换为
变量集合:向量。=新向量。()
集合。推送(“一”)
集合。推送(“两个”)
集合。推送(“三”)
for each(var eachNumber:集合中的字符串)
{
跟踪(“每个编号:+每个编号)
}
var vectorContainer:vectorContainer=新的vectorContainer(集合)
while(vectorContainer.hasNext())
{
跟踪(vectorContainer.next)
}
}
}
公共类向量容器
{
私有变量集合:Vector。
私有var_指数:int=0
公共函数VectorContainer(集合:Vector.)
{
_集合=集合
}
公共函数hasNext():Boolean
{
返回_索引<_collection.length
}
公共函数get next():*
{
返回_集合[_index++]
}
}
我相信你可以通过称它为向量(no
)[Bindable]来引用非类型向量
公共变量selectedItems:Vector。;
公共功能选择更改(项目:矢量):无效
{
选择编辑项=向量(项);
}
使用ApacheFlex4.11.0,您已经可以随心所欲了。它可能从4.9.0开始就存在,但我以前从未尝试过。这是一个很好的问题。未知领域!这会导致类型转换错误。如果我创建一个向量。并将其传递给我的迭代器,编译器会抱怨如何强制转换向量。对于一个向量。只是一种预感-尝试将该方法声明为接受一个向量(没有类型参数),根据编译器,该向量的语法是非法的。它至少需要向量。()这会导致类型转换错误。如果我创建一个向量。并将其传递给我的迭代器,编译器会抱怨如何强制转换向量。这是迭代器构造函数VectorIterator(集合:Vector.),下面是创建的外观:var spriteList:Vector.=新向量。()var iterator:vectoritator=newvectoritator(Vector.(spriteList))相当难看:)这是否意味着无法保留键入内容?也就是说,有一个矢量器。或者矢量器……是的,据我所知。泛型不是ECMA语言规范的一部分,所以我无法用泛型类型定义类。我可以使用Vector类,但据我所知,这更像是一种编译器级的黑客行为。@Brian-AVM本机支持Vector。我没有研究它们是如何定义的,但它们的引用方式绝对是独一无二的。请看我的自我回答问题-谢谢Richard,看看向量是如何实现的很有趣,希望泛型很快就会成为语言的一部分,再加上as3mock的一个合适的代理系统,使模拟对您来说变得非常容易:根据编译器,这是非法语法。它至少需要向量。()
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++]
}
}
[Bindable]
public var selectedItems:Vector.<Category>;
public function selectionChange(items:Vector.<Object>):void
{
selectedItems = Vector.<Category>(items);
}