Haxe:我如何设置一个类来存储我在构造函数中传递的类型数组中的数据

时间:2014-07-03 21:53:05

标签: android flashdevelop haxe openfl

我在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;

的功能

有办法做到这一点吗?

2 个答案:

答案 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;
}