0

我正在使用 Haxe、Lime、OpenFl 进行编码。我正在尝试设置一个类来将数据存储在由类实例引用的 Map 中。类类型将通过推理在构造函数中传递。但我对这一切都很陌生,无法弄清楚语法,这是我到目前为止得到的:

class DynamicStore<A>
{
    private var hashA:Map<Class<A>,String>;

    public function new<A>(paramA:Class<A>) {
        hashA = new Map();
    }
}

但这给了我以下错误:

Abstract Map 没有接受 IMap<Class<DynamicStore.A>, String> 的 @:to 函数

有没有办法做到这一点?

4

2 回答 2

3

先问一个问题:

你真的想使用类作为关键吗?还是物体?

在课堂上应该是关键

使用类的全名作为键会简单得多,例如“mypackage.blob.MyClass”。它更安全,更易于处理和调试。

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>();
    }
}

在这种情况下不能直接使用“Map”的原因是“Map”是一种语法糖,根据键类型被解析为 StringMap、IntMap 或其他。如果它不知道要使用哪种映射,则无法继续(这主要是由于交叉编译问题)。

评论

最后一点,我会提到你的结构对我来说有点古怪/奇怪。了解您要达到的目标以及为什么要按照自己的方式构建它会很有趣。

于 2014-07-04T12:45:00.260 回答
2

我认为您不能将 Class 用作 Map 的键。一个很好的解决方法是使用字符串作为键和类型的完全限定名称。您还可以定义一个抽象以轻松地从 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;
}
于 2014-07-04T08:31:31.647 回答