java中的通用超类

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

public abstract class GenericView extends LAYOUTTYPE 

以便

 public class MyView extends GenericView 

扩展GenericViewHorizontalLayout

 public class MyView2 extends GenericView 

扩展GenericViewVerticalLayout

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

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

 public interface Layout { // Layout functions public void doLayout(); } public class GenericView 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 (new VerticalLayout()); 

希望这可以帮助。

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

我认为你想要实现的是一种多重inheritance – 所以你可以将LAYOUTTYPEfunction与LAYOUTTYPEfunction结合起来。 正如您可能知道的那样,多重inheritance在Java中是不可能的。 但是,您可以使用多个接口,这在很多情况下就足够了。 如果你正在使用Java 8,你甚至可以在这些接口中使用许多函数的default实现(尽管只有在理所当然的情况下)。

“类不能从其类型参数inheritance”(来源:IntelliJ IDEA)。