【发布时间】:2021-03-21 14:25:45
【问题描述】:
我想在泛型类类型的实例之间使用常见的比较运算符(如<、> 或==),例如(try.haxe.org):
class Comp<T> {
var _val: T;
public function new(val: T) _val = val;
// leads to error: Cannot compare Comp.T and Comp.T
public function gt(val: T):Bool return _val > val;
}
class Test {
static function main() {
var intComp = new Comp<Int>(5);
trace(intComp.gt(3));
trace(intComp.gt(6));
var strComp = new Comp<String>("baz");
trace(strComp.gt("bar"));
trace(strComp.gt("foo"));
}
}
使用此代码时,我遇到了编译时错误——“无法比较 Comp.T 和 Comp.T”。这是有道理的,因为你永远不知道 T 类型是什么,它是否可以被普通运算符比较。但我的具体调用new Comp<Int> 或new Comp<String> 清楚地表明这种操作是可能的。
如何仅使用“操作员的可比较”类型来限制 T 类,例如 class Comp<T:HaveComparisonOperators>?或者我应该对编译器说不要在泛型类的代码强制使用具体类型之前对其进行分析?当然,我可以为 Int 和 String 类型创建两种变体,但是除了方法中的类型声明之外,代码几乎相同。
【问题讨论】:
-
不幸的是,我认为没有办法适当地限制它。
-
我认为泛型的行为很奇怪,因为没有提供的类型它们就无法存在。看起来像是编译器优化或构建预防措施。