java中的通用超类
是否有可能在java中创建这样的东西
public abstract class GenericView extends LAYOUTTYPE
以便
public class MyView extends GenericView
扩展GenericView
和HorizontalLayout
和
public class MyView2 extends GenericView
扩展GenericView
和VerticalLayout
?
简短的回答 – 没有。 您extends
的类型必须是实际类型,而不是generics类型参数。
听起来你想要完成多重inheritance,inheritanceView
和Layout
。 这在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 – 所以你可以将LAYOUTTYPE
function与LAYOUTTYPE
function结合起来。 正如您可能知道的那样,多重inheritance在Java中是不可能的。 但是,您可以使用多个接口,这在很多情况下就足够了。 如果你正在使用Java 8,你甚至可以在这些接口中使用许多函数的default
实现(尽管只有在理所当然的情况下)。
“类不能从其类型参数inheritance”(来源:IntelliJ IDEA)。