Pregunta

no es un inmutable clase:

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

se ha muchos métodos similares se prolonga por:

Timerange extends Scope<Date>

y muchos los demás (también inmutables).

Id como ellos para regresar objeto de su tipo. Por ejemplo:

timerange.crop(scope)

debe devolver TimeRange objeto, no Ámbito de aplicación.

¿Tengo que anular todos los métodos (o uso reflexión)? ¿Hay otra manera de hacer esto?

Gracias de antemano, Etam.

¿Fue útil?

Solución

Es necesario algún tipo de fábrica. En este caso la fábrica método funciona bien.

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 (...);
    }
}

Es posible que desee añadir un 'esto' parámetro genérico a la clase base:

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 (...);
    }
}

Esto le añade trabajo extra para el código de cliente.

Otros consejos

Usted podría intentar lo siguiente:

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

TimeRange se definiría como

class TimeRange extends Scope<Date, Timerange>

y así crop devolvería un objeto TimeRange. Cuando no está definida la clase derivada, puede utilizar comodines genéricos (Scope<Date, ?>)

Java no tiene retornos de tipo auto, por lo que por lo general tiene que anular manualmente cada método. Ver mi blog en "tipos de auto" para una discusión con algunas alternativas posibles.

¿Usted realmente necesita Timerange? Qué ofrece nada más que Scope<Date>? Si no, entonces sólo tiene que utilizar <=>.

Otra sugerencia es que tal vez, en lugar de crear instancias de ella mediante el constructor, puede clonar el objeto, y luego modificar los campos apropiadamente para el nuevo objeto. La razón es que el objeto clonado es del mismo tipo que el original.

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top