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