Haxe似乎假设某些事情必须Int
。在以下函数中,
class Main {
static function main() {
function mult_s<T,A>(s:T,x:A):A { return cast s*x; }
var bb = mult_s(1.1,2.2);
}
}
我得到了(使用 Haxe 3.01):
Main.hx:xx: characters 48-49 : mult_s.T should be Int
Main.hx:xx: characters 50-51 : mult_s.A should be Int
谁能解释一下为什么应该Int
T
和A
而不是Float
?
一个更令人费解的例子是这样的:
class Main {
public static function min<T:(Int,Float)>(t:T, t2:T):T { return t < t2 ? t : t2; }
static function main() {
var a = min(1.1,2.2); //compile error
var b = min(1,2); //ok
}
}
我不明白为什么t<t2
暗示t
或t2
是 Int。但Haxe似乎更喜欢Int
:如果用Int
调用min
很好,但如果用Float
's调用,则失败。这合理吗?
谢谢
min<T:(Int,Float)>
表示T
应该既Int
又Float
。请参阅Haxe手册的约束部分。
给定Int
可以隐式转换为Float
,您可以安全地删除Int
的约束。 即以下内容将起作用:
http://try.haxe.org/#420bC
class Test {
public static function min<T:Float>(t:T, t2:T):T { return t < t2 ? t : t2; }
static function main() {
var a = min(1.1,2.2); //ok
$type(a); //Float
trace(a); //1.1
var b = min(1,2); //ok
$type(b); //Int
trace(b); //1
}
}