我在Haxe,Lime,OpenFl编码。我正在尝试设置一个类来将数据存储在Map中,由类实例引用。类类型将通过推理在构造函数中传递。但我对这一切都很陌生,并且无法弄清楚语法,这是我到目前为止所得到的:
class DynamicStore<A>
{
private var hashA:Map<Class<A>,String>;
public function new<A>(paramA:Class<A>) {
hashA = new Map();
}
}
但是这给了我以下错误:
抽象地图没有@:接受IMap&lt; Class&lt; DynamicStore.A&gt;,String&gt;
的功能有办法做到这一点吗?
答案 0 :(得分:3)
首先提出问题:
你真的想用类作为关键吗?还是对象?
课程应该是关键
使用classe的全名作为关键字会更加简单,例如&#34; mypackage.blob.MyClass&#34;。它更安全,更易于处理和调试。
Map<String, String>
在这种情况下就足够了。
如果对象应为键
然后代码看起来像:
import haxe.ds.ObjectMap;
class Test<A>
{
static function main() {}
private var hashA :ObjectMap<A,String>;
public function new(paramA:A) {
hashA = new ObjectMap<A,String>();
}
}
原因&#34;地图&#34;在这种情况下不能直接使用的是&#34; Map&#34;是一个语法糖,根据键类型解析为StringMap,IntMap或其他。如果它不知道要使用哪种地图,则无法继续(这主要是由于交叉编译问题)。
<强>备注强>
作为最后一点,我会提到你的构造对我来说似乎有些古怪/奇怪。知道你想要实现什么以及为什么以你的方式构建它将会很有趣。
答案 1 :(得分:2)
我认为你不能使用Class作为Map的关键。围绕它使用String作为键和类型的完全限定名称的一个很好的工作。您还可以定义一个抽象,以便轻松地从Type移动到String ...类似于以下内容(代码未经过测试);
private var hashA : Map<String, String>;
public function addClass(className : ClassId, ...)
摘要看起来像这样:
abstract ClassId(String) {
inline public function new(name : String) this = name;
@:from public static inline function fromClass(cls : Class<Dynamic>)
return new ClassId(Type.getClassName(cls));
@:to public inline function toClass() : Class<Dynamic>
return Type.resolveClass(this);
@:to public inline function toString() : String
return this;
}