java中的通用超类

时间:2014-10-16 08:50:02

标签: java class generics extends

是否可以在java中创建这样的东西

public abstract class GenericView<LAYOUTTYPE extends AbstractLayout> extends LAYOUTTYPE

这样

public class MyView extends GenericView<HorizontalLayout>

扩展GenericViewHorizontalLayout以及

public class MyView2 extends GenericView<VerticalLayout>

扩展GenericViewVerticalLayout

3 个答案:

答案 0 :(得分:7)

简短的回答 - 没有。您extends的类型必须是实际类型,而不是泛型类型参数。

答案 1 :(得分:2)

听起来你想要完成多重继承,继承ViewLayout。这在Java中是不可能的。你可以用组合来完成类似的事情。如果您的GenericView还必须提供AbstractLayout给出的功能,那么您可以像这样完成:

public interface Layout {
    // Layout functions
    public void doLayout();
}

public class GenericView<T extends AbstractLayout> implements Layout {
    private final T delegateLayout;

    // Construct with a Layout
    public GenericView(T delegateLayout) {
        this.delegateLayout = delegateLayout;
    }

    // Delegate Layout functions (Eclipse/IntelliJ can generate these for you):
    public void doLayout() {
        this.delegateLayout.doLayout();
    }

    // Other GenericView methods
}

public class VerticalLayout extends AbstractLayout {
    public void doLayout() {
        // ...
    }
}

在此之后,您实际上可以这样做:

new GenericView<VerticalLayout> (new VerticalLayout());

希望这有帮助。

答案 2 :(得分:1)

可悲的是,这在Java中是不可能的。我能想到的主要原因是Type Erasure的问题 - 一旦编译了这个类,它将不再知道LAYOUTTYPE是什么。

我认为您尝试实现的是一种多重继承 - 因此您可以将LAYOUTTYPE的功能与GenericView的功能结合起来。正如您可能知道的那样,多重继承在Java中是不可能的。但是,您可以使用多个接口,这在很多情况下就足够了。如果您正在使用Java 8,那么甚至可以在这些接口中为许多函数实现default实现(尽管只有在理所当然的情况下)。

相关问题