尽管我认为自己是中级的Haskeller(理解RankNTypes,但是却遇到了箭头“ proc”表示法的困扰),但我对Java的看法更加呆板.尽管如此,我还是决定在Java中不能做的一件事类似于Ix类型类和Haskell的灵活索引数组.我打算自己动手,但由于我自己缺乏经验,我已经做好了准备.有人可以给我有关此任务的任何建议或指示吗?我是在做错所有事情,还是我有正确的主意? Java SE 7平台是否已经有某种我错过了的东西?有人已经这样做了吗?
我有以下接口模拟Ix类型类:
public interface Ix> {
int indexIn(IxRange range);
boolean isIn(IxRange range);
boolean isFirstIn(IxRange range);
boolean isLastIn(IxRange range);
T nextIndexIn(IxRange range);
T prevIndexIn(IxRange range);
IxRange maxRange();
}
与Java一样,由于接口中缺少静态方法,我无法完全复制原始类型类,但是我认为这是解决该问题的合理方法(除了maxRange()之外,它使我很烦恼).如果有人有更好的主意,请告诉我.
由于我没有可用的元组(我不想依赖于FunctionalJava),所以我做了下面的类(Ix T方法,除其他外,省略了).
public class IxRange> implements Ix> {
public final T lowerBound;
public final T upperBound;
public IxRange(T lB,T uB) {
lowerBound = lB;
upperBound = uB;
}
public int rangeSize() {
return upperBound.indexIn(this) - lowerBound.indexIn(this);
}
}
然后,我有一个像这样开始的课??程:
public class FlexArray,E> extends AbstractList implements Cloneable
这是我最麻烦的地方,主要但并非唯一,因为要先调用一个实例才能调用maxRange()(gah!).我还为实现Ix< T>的常见类型提供了几种包装器类.界面,但这是一个辅助问题.
总而言之,我正在寻找有关如何进行的建议,以及在可能的情况下如何重构Ix I的建议.摆脱maxRange()并将其替换为更好的东西.也欢迎对此任务有一般的想法,但这不是这个问题的重点.