1

このクラスは、私がまだよく知らないクラス定義を使用するマグノリアCMSソースで見つかりました。次のコードスタイルの使用法についての知識を持っている人は、これが正確に何をするのかを私に説明できますか?

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

public class RenderingModelImpl < RD extends RenderableDefinition >  
    implements RenderingModel {

以下は、 magnoliajavadocsで見つけることができる完全なクラスです。

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;
    }

}
4

2 に答える 2

5

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

RenderingDefinitionを拡張するクラスFooがあるとしましょう。この呼び出しを行うことができます...

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

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

ジェネリックスのより簡単な例については、Java 5以降のJavaコレクション(List、Set、Mapなど)を参照してください。

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

于 2010-12-28T07:06:42.467 に答える
0

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

于 2010-12-28T07:10:56.310 に答える