2010-12-28 4 views
1

입니다.이 클래스는 magnolia에서 찾았습니다. 클래스 정의를 사용하는 CMS 소스 저는 아직 익숙하지 않습니다. 다음 코드 스타일의 사용에 대한 지식을 가진 사람이라면 정확히 이것이 무엇을하는지 설명 할 수 있습니까?다음 Java 코드 줄의 의미는

이 코드 샘플에서는 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; 
    } 

} 

답변

5

에서 찾을 수 있습니다 전체 클래스입니다. RD는 "유형 매개 변수"로 알려져 있습니다. "RD extends RenderingDefinition"부분은 RenderingDefinition의 하위 클래스 인 클래스로 매개 변수화 된 RenderingModelingImpl의 인스턴스를 만들 수 있음을 의미합니다.

...의 당신이, 당신이 전화를 걸 수있을 것 RenderingDefinition를 확장 클래스 푸 있다고 가정 해 봅시다

이것은 영향을 미칠 것

새로운 RenderingModelImpl < 푸> (...) 그 어떤 RD를 돌려주기 위해서 (때문에) 지정된 RenderingModelImpl의이 인스턴스의 메소드는 Foo를 돌려줍니다.

제네릭의 더 간단한 예는 Java 5 이상의 Java 콜렉션 (목록, 설정, 맵 등)을 참조하십시오.

두 개의 인터페이스를 구현할 수 없다는 것에 대해서도 올바르지 않습니다. Java 클래스는 여러 인터페이스를 구현할 수 있습니다. 단일 기본 클래스로 제한되는 것은 서브 클래스 화일뿐입니다.

0

메서드 또는 생성자에 대한 매개 변수를 취할 제네릭 형식을 정의하지만이 제네릭 형식은 RenderableDefinition에서 확장되거나 implemet RenderableDefinition이어야합니다. 따라서 new RenderingModelImpl<AnyCLass>();으로 생성하면 RenderableDefinition에서 AnyClass를 확장해야하며 다른 유형은 허용되지 않습니다.