haxe的泛型在使用中可以定义约束条件,<T>可以通过
typedef Measurable = {
public var length(default, null):Int;
}//这里定义了一个可获取长度的约束条件
class Main {
static public function main() {
trace(test([]));
trace(test(["bar", "foo"]));
// String should be Iterable<String>
//test("foo");
}
#if (haxe_ver >= 4)
static function test<T:Iterable<String> & Measurable>(a:T) {
#else
static function test<T:(Iterable<String>, Measurable)>(a:T) {
#end
if (a.length == 0) return "empty";
return a.iterator().next();
}
}
在haxe4以上的版本 可用<T:Iterable<String> & Measurable>来描述,4以下版本用<T:(Iterable<String>, Measurable)>来描述
这样可以精确使用泛型,本例子说了,传入的参数必定是可迭代型,且必须有length属性的。
也可以但条件约束,如下:
class Main {
static public function main() {
trace(test([]));
trace(test(["bar", "foo"]));
}
static function test<T:Iterable<String>>(a:T) {
return a.iterator().next();
}
}
只要是能迭代的就行