Java中的通用特性

3
在我的项目中,我有多个严格排序的类型,并且我需要它们都支持范围操作 - 给定两个边界值,返回所有中间值的列表。
为了避免重复,我认为我可以创建一个类似于下面的“特征”,它将声明相应的原始操作并在其上构建范围方法。
public interface Navigable {

    public Navigable previous() throws UnsupportedOperationException;

    public boolean isFirst();

    public Navigable next() throws UnsupportedOperationException;

    public boolean isLast();

    public boolean precedes(Navigable other);

    public default List<Navigable> range(Navigable to) {

        Navigable from = this;

        boolean invert = to.precedes(from);
        if (invert) {
            Navigable tmp = from;
            from = to;
            to = tmp;
        }

        List<Navigable> result = new LinkedList<>();

        while (from.precedes(to)) {
            result.add(from);
            from = from.next();
        }

        result.add(to);

        if (invert) {
            reverse(result);
        }

        return result;
    }
}

然而,使用这样的接口,我需要按照以下方式实现操作:
public class Item implements Navigable {
    ...
    @Override
    public boolean precedes(Navigable other) {
        ...
    }
    ...
}

当然,这是错误的。我所需要的是以下内容。
public class Item implements Navigable {
    ...
    @Override
    public boolean precedes(Item other) {
        ...
    }
    ...
}

希望我要达到的目标很明确。正确的做法是什么?

1
小错误,preceeds 应为 precedes,如果你的意思是“某物在另一物之前出现”。 - Paul Richter
考虑到您已经有了有序列表,我建议尝试利用Comparable和通用方法来提取范围,而不是实现这个庞大的自定义接口。 - Richard
在Comparable接口中,我只有precedes方法。为了实现range方法,我还需要其他四个方法。你能否详细解释一下你的回答是什么意思呢?那就太好了 :) - Dušan Rychnovský
1个回答

9

您需要使接口具有通用性,并略微更改abstract方法。

例如:

public interface Navigable<T extends Navigable> {
    ...
    public boolean preceeds(T other);
    ..
}

然后,当您实现接口时,您将能够轻松完成以下操作(无需任何编译错误):

public class Item implements Navigable<Item> {
    ...
    @Override
    public boolean preceeds(Item other) {
        ...
    }
    ...
}

这个方法可以工作,但是在将值从一个类型分配给另一个类型时,需要在范围方法中进行显式类型转换,例如T from = (T) this;。难道没有100%类型安全的解决方案吗? - Dušan Rychnovský
@DušanRychnovský 不是使用Java。 - Luiggi Mendoza
1
@DušanRychnovský - 你试过使用 T from = this; 而不是 Navigable from = this; 吗? - OldCurmudgeon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接