Domanda

c'è un immutabile classe:

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

ha molti metodi simili è prorogato di:

Timerange extends Scope<Date>

e molti gli altri (anche immutabili).

Id come loro per tornare all'oggetto del suo tipo. Ad esempio:

timerange.crop(scope)

dovrebbe restituire TimeRange oggetto, non Ambito.

Devo sovrascrivere ogni metodo (o l'uso di riflessione)? C'è un altro modo di fare questo?

Grazie in anticipo, Etam.

È stato utile?

Soluzione

È necessario un qualche tipo di fabbrica. In questo caso fabbrica metodo funziona bene.

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

Si consiglia di aggiungere un 'questo' parametro generico alla classe di 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 (...);
    }
}

Questo fa aggiungi lavoro extra per il codice del client.

Altri suggerimenti

Si potrebbe provare il seguente:

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

TimeRange sarebbe stato definito come

class TimeRange extends Scope<Date, Timerange>

e così crop sarebbe restituire un oggetto TimeRange. Quando la classe derivante non è definito, è possibile utilizzare i caratteri jolly generici (Scope<Date, ?>)

Java non ha auto-tipo restituisce, in modo da in genere bisogno di forzare manualmente ogni metodo. Vedere il mio blog su "tipi di auto" per un discussione con alcune possibili alternative.

Avete veramente bisogno Timerange? Ha offre nulla di più di un semplice Scope<Date>? Se no, allora basta usare <=>.

Un altro suggerimento è che forse, invece di istanziare esso utilizzando il costruttore, è possibile clonare l'oggetto, e quindi modificare i campi in modo appropriato per il nuovo oggetto. La ragione è che l'oggetto clonato è dello stesso tipo di quello originale.

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top