haxe - @: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();
}
}
解决方案
您根本不需要自己的课程。而且由于您的值是动态存储的,因此每种键类型只需要一个映射实例。如果不需要,您可以将其更改回每个值的实例,但是为什么要使用动态值呢?无论如何,这是一个适用于所有目标的地图版本。
@: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);
推荐阅读
- reactjs - 如何使用承诺来查看是否已加载 firebase 身份验证?
- python - 找到特定作品时在python中格式化文本文件?
- gradle - 未找到 Kotlin Gradle 脚本中外部类的导入
- css - 不用js使用webpack编译.scss文件
- google-cloud-platform - 超出 Google BigQuery ExtractBytesPerDay 使用配额 - 什么是 ExtractBytesPerDay?
- rundeck - 如何手动创建具有对一个、多个或所有 rundeck 项目的只读访问权限的 rundeck 用户
- javascript - 使用 XMLHttpRequest(纯 JS)向 PHP 发送数组
- dart - petitparser 解析器可以安全地重用吗?
- godot - Godot:在实例节点的子节点上添加_child() 以递归创建对象
- c++ - 声明一个向量返回类型函数并返回向量