Java中的一种通用特性

Java中的一种通用特性,java,generics,Java,Generics,在我的项目中,我有多个严格排序的类型,我需要它们都支持范围操作——给定两个边界值,返回所有中间值的列表 为了不重复我自己,我想我应该创建一个“trait”,如下所示,它将声明相应的基本操作,并在上面构建一个range方法 public interface Navigable { public Navigable previous() throws UnsupportedOperationException; public boolean isFirst(); pub

在我的项目中,我有多个严格排序的类型,我需要它们都支持范围操作——给定两个边界值,返回所有中间值的列表

为了不重复我自己,我想我应该创建一个“trait”,如下所示,它将声明相应的基本操作,并在上面构建一个range方法

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(Item other) {
        ...
    }
    ...
}

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

您必须使您的界面通用,并稍微更改
抽象方法

例如:

public interface Navigable<T extends Navigable> {
    ...
    public boolean preceeds(T other);
    ..
}
公共界面可导航{
...
公共布尔过程(T其他);
..
}
然后,在实现该接口时,您将能够执行以下操作(无任何编译错误):

公共类项实现可导航{
...
@凌驾
公共布尔值项目(其他项目){
...
}
...
}

如果你的意思是“在另一事物之前的事物”。鉴于你已经有了有序的列表,我将尝试使用Comparable和通用方法来提取范围,而不是实现这个大型自定义接口。在Comparable中,我只有Preferences方法。为了实现range方法,我还需要另外四个。请你详细说明你的回答是什么意思好吗?那太好了这是可行的,但在分配给from时,需要在range方法中进行显式类型转换,例如T from=(T)This;。难道没有100%类型安全的解决方案吗?@DušanRychnovský不在Java中。@DušanRychnovský-您是否尝试过
t from=this而不是
可导航自=此
public interface Navigable<T extends Navigable> {
    ...
    public boolean preceeds(T other);
    ..
}
public class Item implements Navigable<Item> {
    ...
    @Override
    public boolean preceeds(Item other) {
        ...
    }
    ...
}