haXe学习笔记:写一个支持类型参数的静态方法

在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<换行>

不过这个方法里面要创建数组,效率不太高,图方便可以用一下,呵呵。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注