是否可能在Haxe中具有嵌入式类型参数,例如class Foo <bar <t>&gt; </bar <t>

时间:2014-09-03 21:44:36

标签: haxe

只是一个简单的问题。 是不是在Haxe中有嵌入式参数?

class Foo<Bar<T>> {
}

编译器(Haxe 2.10)抱怨“意外&lt;”错误在这里...

修改:更多详情

假设我们有3个类/ typedef:

/** 
   this is a 2d grid storing a certain type
   Instead of a 2-dimensional array _a[x][y],
   it has a 1-dimensional internal array _a[directIndex]
 */
class Grid<T> {
    var _a:Array<T>;   // a single dimension Array for the grid
    public function new(width:Int, height:Int);
    public function iterator():Iterator<T> { return _a.iterator(); }
    public function iterator_coord():GridCoordIter<T> { return new GridCoordIter<T>(this); }
}

typedef GridCoord<T> = {
    var x: Int;
    var y: Int;
    var i: Int;        // direct index
    var v: T;
}

class GridCoordIter<GridCoord<T>> {
    // .. some vars
    public function new(grid:Grid<T>);
    public function iterator():GridCoordIter<GridCoord<T>> { return this; }
    // next(), hasNext()
}

class GridCoordIter<GridCoord<T>> {行拒绝编译。

我猜这个类是参数化为T的类型,所以只需输入class GridCoordIter<T> {},对吧? 但是因为我希望迭代器可以迭代,所以需要像public function iterator():GridCoordIter<GridCoord<T>> { return this; }这样的行。 由于我们return this,类的类型实际上似乎必须是class GridCoordIter<GridCoord<T>>

我现在无法找到摆脱这种矛盾的方法。

2 个答案:

答案 0 :(得分:0)

我有两个问题: - 为什么haxe 2.10?它真的很古老。目前的版本是3.1.3 - Foo<Bar<T>>应该是什么意思?如果您需要约束,则语法为Foo<T:Bar<T2>,T2>或其他

答案 1 :(得分:0)

结果显示GridCoordIter的类型仅由T参数化。 因此class GridCoordIter<GridCoord<T>>应写为class GridCoordIter<T>

至于public function iterator():GridCoordIter<GridCoord<T>> { return this; },我们可以简单return cast this;

所以改变:

class GridCoordIter<GridCoord<T>> {
    // .. some vars
    public function new(grid:Grid<T>);
    public function iterator():GridCoordIter<GridCoord<T>> { return this; }
    // next(), hasNext()
}

要:

class GridCoordIter<T> {
    // .. some vars
    public function new(grid:Grid<T>);
    public function iterator():GridCoordIter<GridCoord<T>> { return cast this; }
    // next(), hasNext()
}

现在可行。