我在magnolia CMS源代码中发现了这个类,它使用了我还不熟悉的类定义。任何知道如何使用以下代码样式的人都可以向我解释这究竟是什么吗?
在此代码示例中,RenderingModel
和RenderableDefinition
都是接口。我知道我们不能在一个类中实现两个接口,但是这里通过其他方式实现。有人可以解释我在以下行中使用的技术,特别是:
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;
}
}
答案 0 :(得分:5)
这是Java泛型。 RD被称为“类型参数”。 “RD extends RenderingDefinition”部分意味着您可以使用RenderingDefinition的子类创建RenderingModelingImpl实例。
假设您有扩展RenderingDefinition的类Foo,您将可以进行此调用...
new RenderingModelImpl&lt; Foo&gt;(...)
这将导致指定为返回RD的RenderingModelImpl实例上的任何方法都将返回Foo。
对于许多更简单的泛型示例,请参阅Java 5或更新版本中的Java集合(List,Set,Map等)。
由于无法实现两个接口,您也不正确。 Java类可以实现任意数量的接口。它只是子类,仅限于一个基类。
答案 1 :(得分:0)
定义泛型类型以获取方法或构造函数的参数,但此泛型类型必须从RenderableDefinition扩展或必须是实现RenderableDefinition。因此,当您使用new RenderingModelImpl<AnyCLass>();
创建时,必须从RenderableDefinition扩展AnyClass,否则将不接受其他类型。