1

我在 magnolia CMS 源代码中找到了这个类,它使用了我还不熟悉的类定义。任何了解使用以下代码样式的人都可以向我解释这到底是做什么的吗?

在此代码示例中RenderingModelRenderableDefinition都是接口。据我所知,我们不能在一个类中实现两个接口,但这里是通过其他方式实现的。有人可以向我解释一下以下行中使用的技术吗:

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

}
4

2 回答 2

5

这是 Java 泛型。RD 被称为“类型参数”。“RD 扩展 RenderingDefinition”部分意味着您可以创建 RenderingModelingImpl 的实例,该实例使用作为 RenderingDefinition 子类的任何类参数化。

假设您有扩展 RenderingDefinition 的类 Foo,您将能够进行此调用...

新的 RenderingModelImpl<Foo>(...)

这将产生这样的效果,即在此 RenderingModelImpl 实例上指定为返回 RD 的任何方法都将返回 Foo。

有关泛型的许多更简单示例,请参阅 Java 5 或更高版本中的 Java 集合(List、Set、Map 等)。

关于无法实现两个接口,您也不正确。Java 类可以实现任意数量的接口。只有子类化仅限于单个基类。

于 2010-12-28T07:06:42.467 回答
0

定义泛型类型以获取方法或构造函数的参数,但此泛型类型必须从 RenderableDefinition 扩展或必须实现 RenderableDefinition。所以当你用new RenderingModelImpl<AnyCLass>();AnyClass 创建时必须从 RenderableDefinition 扩展,其他类型将不被接受。

于 2010-12-28T07:10:56.310 回答