是否可以在java中创建这样的东西
public abstract class GenericView<LAYOUTTYPE extends AbstractLayout> extends LAYOUTTYPE
这样
public class MyView extends GenericView<HorizontalLayout>
扩展GenericView
和HorizontalLayout
以及
public class MyView2 extends GenericView<VerticalLayout>
扩展GenericView
和VerticalLayout
?
答案 0 :(得分:7)
简短的回答 - 没有。您extends
的类型必须是实际类型,而不是泛型类型参数。
答案 1 :(得分:2)
听起来你想要完成多重继承,继承View
和Layout
。这在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
实现(尽管只有在理所当然的情况下)。