比方说,我有一些父类型的数组或向量。要将其传递给函数,我需要将其设置为某种子类型(我事先知道所有元素都必须保证是该子类型)。有方便的方法吗?现在,我只能考虑制作一个全新的阵列。
此外,它似乎也不允许我这样做:它不会在父类型的位置接受子类型的数组。是否有解决此问题的好方法?
看起来var files = $('#file')[0].files;
可行,但这是首选方式吗?
答案 0 :(得分:5)
要将其传递给函数,我需要将其设置为某种子类型(我事先知道所有元素都必须保证是该子类型)。
如果您确实确信是这种情况,那么使用cast
是安全的。我认为没有什么更漂亮的方法,也不应该,因为它本质上并不美观。不得不这样做通常表明您的代码或正在使用的API中存在设计缺陷。
反之,了解为什么不安全是有帮助的。由于这种思考过程,其原因不一定像直观的那样:
我可以将
Child
分配给Base
,为什么不能将Array<Child>
分配给Array<Base>
?
此确切示例用于说明差异 in the Haxe Manual。您绝对应该完整阅读它,但是在这里我将给出一个简短的摘要:
var children = [new Child()];
var bases:Array<Base> = cast children;
bases.push(new OtherChild());
children[1].childMethod(); // runtime crash
如果您可以将Array<Child>
分配给Array<Base>
,则然后您可以将push()
与Child
不兼容的类型。但是,正如您提到的,您可以再次cast
使其静音,如上面的代码片段所示。
然而,这并不总是安全的-可能仍然有代码保存对该原始Array<Child>
的引用,该原始childMethod()
现在突然包含了意外的内容!这意味着我们可以像在没有该方法的对象上调用cast
之类的操作,并导致运行时崩溃。
反之亦然,如果没有代码保留此类引用(或者如果引用是只读的,例如通过haxe.ds.ReadOnlyArray
),则可以安全地使用compileJava {
//disable compilation in a separate daemon process...should be faster?
options.fork = false
options.compilerArgs << '-Xshare:on'
}
。
最终,要在制作副本的性能成本(根据大小可能忽略不计)与您对自己比编译器更聪明/对所有引用的了解有多自信之间进行权衡存在。