che cosa fa seguente riga Java di mezzi di codice
-
13-10-2019 - |
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;
}
}
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.