В чем разница между BaseButton <E>и BaseButton <E extends BaseButton <E>>? - PullRequest
0 голосов
/ 04 марта 2012

У меня есть два формата класса BaseButton:

public abstract class BaseButton<E extends BaseButton<E>> extends JXButton implements Initializer {

    private static final long serialVersionUID = 11L;

    public BaseButton() {
        LibraryLogger.initMessage(ClassUtils.getInstance().getResolvedClassName(this.getClass()));  
        initialize();
    }

    public abstract void initialize();
}

И

public abstract class BaseButton<E> extends JXButton implements Initializer {

    private static final long serialVersionUID = 11L;

    public BaseButton() {
        LibraryLogger.initMessage(ClassUtils.getInstance().getResolvedClassName(this.getClass()));  
        initialize();
    }

    public abstract void initialize();
}

И я создаю дочерние классы как:

public class GreenButton extends BaseButton<GreenButton> {

}

У меня вопрос, в чем разница между этими двумя типами общего обозначения?

Какой из них лучше и почему?

Любая информация будет очень полезна для меня.

Спасибо.

1 Ответ

2 голосов
/ 04 марта 2012

С предоставленным вами кодом это не имеет значения.

Однако, когда вы начнете использовать универсальный тип E, именно тогда вы увидите разницу.В первом примере E будет иметь все методы и члены BaseButton.Итак, если у BaseButton есть метод int foo(String s), вы сможете сказать:

int bar(E arg) {
    arg.foo("test");
}

Если вы попробуете то же самое со вторым примером, компилятор сообщит об ошибке, потому что E неявно расширяет Object, а Object не имеет foo метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...