首页 > 解决方案 > @:generic 仅适用于某些类型参数

问题描述

如果我想创建具有 2 个类型参数的类,并且我希望为每个使用的第一个类型参数专门实现,但我不希望它用于第二个类型参数。

例如我想要我自己的地图

@:generic @:remove
class MyMap {
    public var map: Map<K, V> = new Map();
    public function new() {}
}

这将为使用的 K 和 V 的每个组合生成实现。但我只想要 K 的不同实现。

我尝试abstract@:generic使用所需的类型参数来改写类,或者扩展此类。但这不起作用。两种方式 haxe 编译器都会生成 MyMapBase 类的创建,并且根本不生成该类。

@:generic @:remove
class MyMapBase<K> {
    public var map: Map<K, Dynamic> = new Map();
    public function new() {}
}

class MyMap1<K, V> extends MyMapBase<K> {
}

abstract MyMap2<K, V>(MyMapBase<K>) {
    public function new() {
        this = new MyMapBase();
    }
}

标签: haxe

解决方案


您根本不需要自己的课程。而且由于您的值是动态存储的,因此每种键类型只需要一个映射实例。如果不需要,您可以将其更改回每个值的实例,但是为什么要使用动态值呢?无论如何,这是一个适用于所有目标的地图版本。

@:multiType
abstract MyMap<K, V>(Map<K, Dynamic>) {

    public function new();

    public inline function set(k:K, v:V) this.set(k, v);
    public inline function get(k:K) return this.get(k);

    public static var string_map = new Map<String, Dynamic>();
    @:to static inline function toStringMap<K:String>(t:Map<K, Dynamic>) {
        return string_map;
    }

    public static var int_map = new Map<Int, Dynamic>();
    @:to static inline function toIntMap<K:Int>(t:Map<K, Dynamic>) {
        return int_map;
    }

    public static var object_map = new Map<{}, Dynamic>();
    @:to static inline function toObjectMap<K:{}>(t:Map<K, Dynamic>) {
        return object_map;
    }
}
    var i = new MyMap<String, Int>();
    i.set("zero", 0);
    trace(Type.getClassName(Type.getClass(i))); //haxe.ds.StringMap
    trace(i); // {zero => 0}
    var s = new MyMap<String, String>();
    s.set("one", "1");
    trace(Type.getClassName(Type.getClass(s))); //haxe.ds.StringMap
    trace(s); // {zero => 0, one => 1}
    // var v:Int = i.get("one") will fail on Java and HL
    // we let v to infer as Null<Dynamic> instead
    var v = i.get("one");
    trace(v);

推荐阅读