Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的泛型超类_Java_Class_Generics_Extends - Fatal编程技术网

java中的泛型超类

java中的泛型超类,java,class,generics,extends,Java,Class,Generics,Extends,是否可以在java中创建类似的内容 public abstract class GenericView<LAYOUTTYPE extends AbstractLayout> extends LAYOUTTYPE 扩展GenericView和VerticalLayout?简短回答-否。您扩展的类型必须是实际类型,而不是泛型类型参数。遗憾的是,这在Java中是不可能的。我能想到的主要原因是类型擦除的问题——一旦编译该类,它将不再知道什么是LAYOUTTYPE 我认为您试图实现的是一种多

是否可以在java中创建类似的内容

public abstract class GenericView<LAYOUTTYPE extends AbstractLayout> extends LAYOUTTYPE

扩展
GenericView
VerticalLayout

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

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


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

听起来您想要完成多重继承,从
视图
布局
继承。这在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() {
        // ...
    }
}
公共界面布局{
//布局功能
公共空间布局();
}
公共类GenericView实现布局{
私人最终授权布局;
//用布局构造
公共常规视图(T delegateLayout){
this.delegateLayout=delegateLayout;
}
//委托布局函数(Eclipse/IntelliJ可以为您生成这些函数):
公共空间布局(){
这个.delegateLayout.doLayout();
}
//其他GenericView方法
}
公共类VerticalLayout扩展了AbstractLayout{
公共空间布局(){
// ...
}
}
在此之后,您可以实际执行以下操作:

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

希望这能有所帮助。

在某些情况下,这会很好,但我怀疑这是可能的。即使这是可能的,它也是无用的。@talex哦,我不知道-它可能像多重继承的一种弱形式,有时会派上用场。“但它也带来了危险。”布拉拉萨阿德里说,“你认为它会起什么作用呢?”。由于在
LAYOUTTYPE
中没有关于方法或字段的编译时信息,所以它不会向接口添加任何内容。@talex实际上有一些编译时信息:它扩展了
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());