2010-12-28 19 views
1

magnoliaでこのクラスが見つかりました。クラス定義を使用しているCMSソースです。まだ慣れていません。次のコードスタイルの使用法について知っている人は誰でも、これが正確に何を説明してくれますか?次のJavaコード行は何を意味するのですか

このコードサンプルでは、​​RenderingModelRenderableDefinitionは両方のインターフェイスです。私が知っているように、1つのクラスに2つのインタフェースを実装することはできませんが、ここでは他の方法で実現しています。誰かが私に説明してもらえ、特に次の行に使用される技術:

public class RenderingModelImpl < RD extends RenderableDefinition > 
    implements RenderingModel { 

次は、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; 
    } 

} 

答えて

5

でこれは、Javaのジェネリックであるかもしれない完全なクラスです。 RDは「タイプパラメータ」として知られています。 「RD extends RenderingDefinition」の部分は、RenderingDefinitionのサブクラスである任意のクラスでパラメータ化されたRenderingModelingImplのインスタンスを作成できることを意味します。

新しいRenderingModelImpl <はFoo>(...)

...あなたはこの電話をかけることができるようになります、あなたはRenderingDefinitionを拡張するクラスはFooがあるとしましょう

これはどんな効果がありますRDを返すように指定されたRenderingModelImplのこのインスタンスのメソッドはFooを返します。

多くの簡単なジェネリックの例については、Java 5以降のJavaコレクション(リスト、セット、マップなど)を参照してください。

また、2つのインターフェイスを実装できないという点についても正しくありません。 Javaクラスは、任意の数のインタフェースを実装できます。単一の基本クラスに限定されているのはサブクラス化だけです。

0

メソッドまたはコンストラクタのパラメータを取るジェネリック型を定義しますが、このジェネリック型はRenderableDefinitionから拡張するか、RenderableDefinitionを実装する必要があります。したがって、new RenderingModelImpl<AnyCLass>();で作成する場合は、AnyClassをRenderableDefinitionから拡張する必要があります。他のタイプは受け入れられません。

関連する問題