Question

est un immuable classe:

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

il a beaucoup des méthodes similaires est prolongée par:

Timerange extends Scope<Date>

et nombre autres (aussi immuables).

Id comme eux pour revenir objet de ce type. Par exemple:

timerange.crop(scope)

doit renvoyer l'objet TimeRange, pas étendue.

Dois-je remplacer toutes les méthodes (ou la réflexion de l'utilisation)? Y at-il une autre façon de le faire?

Merci d'avance, Etam.

Était-ce utile?

La solution

Vous avez besoin d'une sorte d'usine. Dans cette méthode, l'usine de cas fonctionne très 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 (...);
    }
}

Vous pouvez ajouter un paramètre générique « ceci » à la classe de 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 (...);
    }
}

Ceci n'ajoute du travail supplémentaire au code client.

Autres conseils

Vous pouvez essayer ce qui suit:

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

TimeRange serait défini comme

class TimeRange extends Scope<Date, Timerange>

et ainsi renverrait un crop objet TimeRange. Lorsque la classe dérivateur est pas définie, vous pouvez utiliser des caractères génériques génériques (Scope<Date, ?>)

Java n'ont pas de retours d'auto de type, vous devez donc généralement remplacer manuellement chaque méthode. Voir mon blog sur "auto types" pour discussion avec des solutions de rechange possibles.

Avez-vous vraiment besoin Timerange? Est-il offre quelque chose de plus qu'un simple Scope<Date>? Sinon, il suffit d'utiliser <=>.

Une autre suggestion est que peut-être, au lieu de l'instanciation à l'aide du constructeur, vous pouvez cloner l'objet, puis modifier les champs de manière appropriée pour le nouvel objet. La raison en est que l'objet cloné est le même type que l'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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top