BaseButton <e>和BaseButton <e extends =“”basebutton <e =“”>&gt;?</e> </e>之间有什么区别?

时间:2012-03-04 12:53:01

标签: java generics inheritance

我有两种格式的类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 个答案:

答案 0 :(得分:2)

使用您提供的代码,没有任何区别。

但是,当您开始使用泛型类型E时,那就是您何时开始看到差异。 在第一个示例中,E将包含BaseButton的所有方法和成员。因此,如果BaseButton有方法int foo(String s),您可以说:

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

如果您对第二个示例尝试相同的操作,编译器将报告错误,因为E隐式扩展ObjectObject没有foo方法