假设我有一个类Person
,其中包含一个名为children
的私有数组,其中包含Person
个对象。它有一个方法getChildren():Array { return this.children; }
。
如果我trace(p.getChildren()[0])
(其中p
是Person
的实例),我可以成功打印出阵列中第一个孩子的内容。但是,如果我尝试投射var firstChild:Person = p.getChildren()[0]
,我会收到错误Type Coercion failed: cannot convert []@a027b81 to classes.Person
。
出了什么问题?
答案 0 :(得分:1)
当你这样做时:var firstChild:Person = p.getChildren()[0]
你实际上没有施放。您只是想将Array
填充到您定义为Person
的对象中,这就是您收到错误的原因。
要进行投射,您需要执行以下操作之一:
var firstChild:Person = Person(p.getChildren()[0]); //this will error if the cast fails
var firstChild:Person = p.getChildren()[0] as Person; //this will return null if the cast fails
然而,更好的方法可能是使用Vector
- 它在AS3中就像一个数组,但所有成员都必须是指定类型。所以像这样:
private var children_:Vector.<Person>;
public function getChildren():Vector.<Person>{ return this.children_; }
然后你可以这样做:
var firstChild:Person = p.getChildren()[0]
因为Vector的每个成员都已定义为Person
对象。
此外,您可能需要考虑使用getter方法而不是getChildren
。
public function get children():Vector.<Person> { return this.children_;}
然后您像属性一样访问它(但不能设置它)。