Domanda

Ho trovato questa classe in magnolia source CMS che utilizza definizione di classe non sono ancora familiarità con. chiunque abbia conoscenza circa l'utilizzo dei seguenti stile codice potrebbe spiegare a me che cosa esattamente questo fa?

In questo codice di esempio RenderingModel e RenderableDefinition sono entrambe le interfacce. Come io sono consapevole che non possiamo implementare due interfacce in una classe, ma qui Questo risultato è ottenuto attraverso qualche altro modo. Qualcuno mi potrebbe spiegare la tecnica utilizzata nella seguente riga in particolare:

public class RenderingModelImpl < RD extends RenderableDefinition >  
    implements RenderingModel {

In seguito è la classe completo che si può trovare all'indirizzo magnolia java docs

public class RenderingModelImpl < RD
extends RenderableDefinition >
implements RenderingModel {
    protected final RenderingModel parentModel;
    protected final Content content;
    protected final RD definition;

    public RenderingModelImpl(Content content, RD definition, RenderingModel
parent) {
        this.content = content;
        this.definition = definition;
        this.parentModel = parent;
    }

    public RenderingModel getParent() {
        return this.parentModel;
    }

    public RenderingModel getRoot(){
        RenderingModel model = this;
        while(model.getParent() != null){
            model = model.getParent();
        }
        return model;
    }

    public Content getContent() {
        return this.content;
    }

    /**
     * Shortname for templates: model.def.
     */
    public RD getDef() {
        return getDefinition();
    }

    public RD getDefinition() {
        return this.definition;
    }

    public String execute() {
        return null;
    }

}
È stato utile?

Soluzione

Questa è generici Java. RD è noto come un "parametro di tipo". Il "RD estende RenderingDefinition": parte che è possibile creare istanze di RenderingModelingImpl parametrizzato con qualsiasi classe che è una sottoclasse di RenderingDefinition.

esempio di farvi avere classe Foo che si estende RenderingDefinition, si sarà in grado di fare questa chiamata ...

nuovo RenderingModelImpl (...)

Ciò avrà l'effetto che tutti i metodi di questa istanza di RenderingModelImpl specificate per tornare RD torneranno Foo.

Per molti esempi più semplici di farmaci generici, consultare le collezioni Java (List, Set, Mappa, ecc) in Java 5 o più recente.

Si sono anche non corretta per quanto riguarda non essere in grado di implementare due interfacce. Una classe Java può realizzare qualsiasi numero di interfacce. E 'solo sottoclassi che è limitato ad una sola classe di base.

Altri suggerimenti

La definizione di tipo generico di prendere parametro per i metodi o costruttore, ma questo tipo generico deve essere esteso da RenderableDefinition o deve essere RenderableDefinition implemet. Così, quando si crea con AnyClass new RenderingModelImpl<AnyCLass>(); devono essere estesi da RenderableDefinition, non verranno accettati altri tipi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top