存在的不可变类:

Scope<Cmp extends Comparable<Cmp>>
public Scope<Cmp> crop(Scope<Cmp> scope) {
    ...
    return new Scope<Cmp>(starts, ends);
}

它的许多类似的方法是通过扩展:

Timerange extends Scope<Date>

许多他人(也不可变的)。

像他们标识返回其类型的对象。例如:

timerange.crop(scope)

应该返回TIMERANGE对象,而不是范围。

我必须重写每个方法(或使用反射)? 是否有这样做的另一种方式?

在预先感谢 艾格。

有帮助吗?

解决方案

您需要某种工厂。在这种情况下工厂方法工作得很好。

public abstract class Scope<E extends Comparable<E>> {
    abstract Scope<E> create(E start, E end);

    public Scope<E> crop(Scope<E> scope) {
        ...
        return create(starts, ends);
    }
}
public TimeRange extends Scope<Date> {
    Scope<Date> create(Date start, Date end) {
        return new TimeRange (...);
    }
}

您可能需要一个通用的“这个”参数添加到基类:

public abstract class Scope<THIS extends Scope<THIS, E>, E extend Comparable<E>> {
    abstract THIS create(E start, E end);

    public THIS crop(Scope<E> scope) {
        ...
        return create(starts, ends);
    }
}
public TimeRange extends Scope<TimeRange,Date> {
    TimeRange create(Date start, Date end) {
        return new TimeRange (...);
    }
}

这确实增加额外的工作来在客户端的代码。

其他提示

您可以尝试以下方法:

class Scope<Cpm extends Comparable<Cpm>, Derived extends Scope<Cpm, Derived>> {
  public Derived crop(Scope<Cmp, Derived> scope)
}

TIMERANGE将被定义为

class TimeRange extends Scope<Date, Timerange>

和如此crop将返回TIMERANGE对象。当派生类未定义,可以使用通用的通配符(Scope<Date, ?>

Java没有自我型的回报,所以一般需要手动覆盖每一个方法。请参见我对“自我型” 博客一些可能的替代方案的讨论。

你真的需要Timerange?它不提供任何不仅仅是Scope<Date>?如果没有,那么只需要使用Scope<Date>

另一项建议是,也许,而是采用的构造实例,则可以克隆对象,然后适当地修改的字段为新对象。其原因是,克隆对象是同一类型与原始

Scope<Cmp extends Comparable<Cmp>> implements Cloneable
public Scope<Cmp> crop(Scope<Cmp> scope) {
    ...
    Scope<Cmp> result = (Scope<Cmp>)super.clone();
    result.init(starts, ends); // sets the fields for a cloned object
                               // init() could be private
    return result;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top