在Java中,泛型是1.5版本加入的新语言特性,因此只要你不在乎警告或压制了警告,就可以无视它。但在haXe里,类型参数是你无法避免的东西,因为Array<T>你是无论如何也得用的。还好,简单使用起来也很容易,没什么不容易理解的地方。
这里说说我们自己怎么编写支持类型参数的类和方法。
支持类型参数的类有很多例子,比如haXe源码里Array<T>的实现,这里摘录代码片段如下:
class Array<T> {
function new() : Void;
function concat( a : Array<T> ) : Array<T>;
function join( sep : String ) : String;
function pop() : Null<T>;
function push(x : T) : Int;
…
}
很简单,只要你在类名后面加上类型参数<T>,编译器就知道后面的成员方法或类属性中的T就是一个类型的占位符,比如上面的concat, pop和push方法中,都引用了这个T作为类型占位符。
这是实例方法,但是静态方法中如果有类型参数,则不能这么写,见下面的例子:
public static function reverseIterator<T>(iter: Iterator<T>) : Iterator<T> {
var all: Array<T> = [];
for (i in iter) {
all.push(i);
}
all.reverse();
return all.iterator();
}
大家可以看到,关键就是在声明中,方法名的后面要加上类型占位符,也就是"<T>",否则的话,编译器不知道后面参数和返回值里的T表示类型参数。
上面例子是一个反向迭代器的简单实现,也算是稍稍弥补下haXe中for语法的缺憾吧,比如你如果想逆向遍历0~10,可以用下面的代码:
for (i in reverseIterator(0…10)) {
trace(i);
}
// 输出: 9<换行>8<换行>7<换行>6<换行>5<换行>4<换行>3<换行>2<换行>1<换行>0<换行>
不过这个方法里面要创建数组,效率不太高,图方便可以用一下,呵呵。