2010-12-28 8 views
1

Ich fand diese Klasse in Magnolie CMS Quelle, die Klassendefinition verwendet, die ich noch nicht kenne. Könnte jemand, der über die Verwendung des folgenden Codestils Bescheid weiß, mir erklären, was genau das ist? In diesem Codebeispiel sind RenderingModel und RenderableDefinition beide Schnittstellen. Wie ich weiß, können wir nicht zwei Schnittstellen in einer Klasse implementieren, aber hier wird dies auf andere Weise erreicht. istWas bedeutet folgende Java Codezeile

public class RenderingModelImpl < RD extends RenderableDefinition > 
    implements RenderingModel { 

Nach der vollständigen Klasse, die Sie bei 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; 
    } 

} 

Antwort

5

Dies ist Java Generics finden können: Könnte mir jemand die Technik in der folgenden Zeile vor allem verwendet erklären. RD ist als "Typparameter" bekannt. Der Teil "RD extends RenderingDefinition" bedeutet, dass Sie Instanzen von RenderingModelingImpl erstellen können, die mit jeder Klasse parametrisiert sind, die eine Unterklasse von RenderingDefinition ist.

Angenommen, Sie Klasse Foo, die RenderingDefinition erstreckt, können Sie diesen Anruf machen ...

neue RenderingModelImpl < Foo> (...)

Dies bewirkt haben, dass jede Methoden für diese Instanz von RenderingModelImpl, für die RD zurückgegeben wird, geben Foo zurück.

Für viele einfachere Beispiele von Generics, siehe Java-Sammlungen (Liste, Set, Map usw.) in Java 5 oder neuer.

Sie sind auch nicht korrekt, wenn es nicht möglich ist, zwei Schnittstellen zu implementieren. Eine Java-Klasse kann eine beliebige Anzahl von Schnittstellen implementieren. Es sind nur Unterklassen, die auf eine einzelne Basisklasse beschränkt sind.

0

Definieren eines generischen Typs, um Parameter für Methoden oder Konstruktoren zu übernehmen, aber dieser generische Typ muss von RenderableDefinition erweitert werden oder muss RenderableDefinition implementieren. Wenn Sie also mit new RenderingModelImpl<AnyCLass>(); erstellen, muss AnyClass von RenderableDefinition erweitert werden, andere Typen werden nicht akzeptiert.