что означает следующая строка кода Java - PullRequest
1 голос
/ 28 декабря 2010

Я нашел этот класс в CMS Магнолии, который использует определение класса, с которым я еще не знаком.Может ли кто-нибудь, имеющий знания об использовании следующего стиля кода, объяснить мне, что именно это делает?

В этом примере кода RenderingModel и RenderableDefinition оба являются интерфейсами.Как я знаю, мы не можем реализовать два интерфейса в одном классе, но здесь это достигается другим способом.Может ли кто-нибудь объяснить мне технику, используемую в следующей строке, особенно:

public class RenderingModelImpl < RD extends RenderableDefinition >  
    implements RenderingModel {

Ниже приводится полный класс, который вы можете найти в Магнолия Java документы

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

}

Ответы [ 2 ]

5 голосов
/ 28 декабря 2010

Это дженерики Java. RD известен как «параметр типа». Часть «RD extends RenderingDefinition» означает, что вы можете создавать экземпляры RenderingModelingImpl, параметризованные с любым классом, который является подклассом RenderingDefinition.

Допустим, у вас есть класс Foo, расширяющий RenderingDefinition, вы сможете сделать этот вызов ...

new RenderingModelImpl (...)

Это приведет к тому, что любые методы в этом экземпляре RenderingModelImpl, указанные для возврата RD, будут возвращать Foo.

Для многих более простых примеров обобщений см. Коллекции Java (Список, Набор, Карта и т. Д.) В Java 5 или новее.

Вы также не правы в том, что не можете реализовать два интерфейса. Класс Java может реализовывать любое количество интерфейсов. Только подклассы ограничены одним базовым классом.

0 голосов
/ 28 декабря 2010

Определение универсального типа для получения параметра для методов или конструктора, но этот универсальный тип должен быть расширен из RenderableDefinition или должен реализовывать RenderableDefinition. Таким образом, когда вы создаете с new RenderingModelImpl<AnyCLass>(); AnyClass должен быть расширен от RenderableDefinition, другие типы не будут приняты.

...