实现Set <t>

时间:2018-09-28 16:15:12

标签: abstract haxe

我正在尝试通过实现dynamic_cast数据类型来包扎static_cast,就像这样:

abstract

不过,编译器并不喜欢这样。它告诉我Set

我一点都不了解,因为如果我将构造函数更改为

abstract Set<T>(Map<T, Bool>) {
  public inline function new() {
    this = new Map<T, Bool>();
  }

  public inline function has(item:T):Bool {
    return this.exists(item);
  }

  public inline function add(item:T):Set<T> {
    this.set(item, true);
    return null;
  }

  public inline function remove(item:T):Set<T> {
    this.remove(item);
    return null;
  }

  public inline function iterator():Iterator<T> {
    return this.keys();
  }
}

然后使用Set.hx:8: characters 11-29 : Abstract Map has no @:to function that accepts IMap<util.Set.T, Bool>实例化,它可以工作。

但是,那太过分了。我想要实例化Set而不暴露基础实现的功能。最终,我希望使用签名为public inline function new(val:Map<T, Bool>) { this = val; } 的构造函数。这可能吗?我误会了吗?

1 个答案:

答案 0 :(得分:7)

问题在于,当前无法实例化Map而不知道它们的密钥类型(并且由于Set.T是自由类型参数,因此不起作用)。但是,由于构造函数是inline,因此T在呼叫站点可能是众所周知的。问题在于,编译器仍尝试生成Set.new。您可以通过在其前面加上@:extern来避免这种情况。工作示例:https://try.haxe.org/#1D06C