【问题标题】:Generic super class in javajava中的泛型超类
【发布时间】:2026-01-30 22:55:01
【问题描述】:

是否可以在java中创建类似的东西

public abstract class GenericView<LAYOUTTYPE extends AbstractLayout> extends LAYOUTTYPE

这样

public class MyView extends GenericView<HorizontalLayout>

扩展 GenericViewHorizontalLayout

public class MyView2 extends GenericView<VerticalLayout>

扩展 GenericViewVerticalLayout?

【问题讨论】:

  • 在某些情况下这会很简洁,但我怀疑这是否可能。
  • 即使可以这样做也没有用。
  • @talex 哦,我不知道——它可能就像多重继承的弱形式,有时可以派上用场。但它带来了危险。
  • @blalasaadri 你期望它如何工作。由于LAYOUTTYPE 中没有关于方法或字段的编译时间信息,因此不会向接口添加任何内容。
  • @talex 实际上有一些编译时信息:它扩展了AbstractLayout。尽管如此,我确实看到了很多问题 - 例如,多次定义的函数,我们不要忽略类型擦除 - 但我也可以看到为什么有时有人可能想要使用这样的东西。

标签: java class generics extends


【解决方案1】:

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

【讨论】:

    【解决方案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());
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】: