【发布时间】:2019-12-09 13:37:26
【问题描述】:
考虑带有类型参数的类,它应该用作Map 键。
class Foo<K> {
var map: Map<K, Dynamic> = new Map();
}
编译时出现错误Type parameters of multi type abstracts must be known。
原因是可以理解的——Map是abstract,它的底层类型是根据键类型来选择的,所以在编译new Map()表达式时应该知道键类型。另一方面,具有类型参数的非泛型类型为所有参数编译一次。
看起来添加@:generic 元数据应该会有所帮助。但实际上并没有。我的猜测是这是因为 haxe 编译器编译 @:generic 类型与编译非泛型类型相同,然后才为泛型类型做一些额外的工作。所以我在想,在 haxe 中拥有一个由 type 参数定义的键类型的 Map 是不可能的。
但最近我偶然发现了这个问题:https://github.com/HaxeFoundation/haxe/issues/2537
Simn 的回答说,这可以通过添加@:remove @:generic 元数据来完成。它确实有效。
@:remove @:generic
class Foo<K> {
var map: Map<K, Dynamic> = new Map();
}
对我来说,这看起来很神奇,我对此感到不舒服。在文档中我只看到 @:remove 导致在生成之前从所有实现类中删除接口。这并不能解释为什么会这样。
【问题讨论】:
标签: haxe