只是一个简单的问题。 是不是在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>>
。
我现在无法找到摆脱这种矛盾的方法。
答案 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()
}
现在可行。