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