Java 在泛型和继承方面遇到困难

Java 在泛型和继承方面遇到困难,java,generics,inheritance,Java,Generics,Inheritance,谈到泛型和继承,我有点纠结。总体思路是为各种组件和包含其他组件的组或容器组件创建一个构建器模式。有些组件组需要特定的组件,有些组件可以是任何组件。这就是问题所在。我认为最好用代码来解释: public abstract class AbstractGroupComponentBuilder <T extends ComponentGroup<R>, R extends AbstractDashboardComponent> implements ComponentBuil

谈到泛型和继承,我有点纠结。总体思路是为各种组件和包含其他组件的组或容器组件创建一个构建器模式。有些组件组需要特定的组件,有些组件可以是任何组件。这就是问题所在。我认为最好用代码来解释:

public abstract class AbstractGroupComponentBuilder <T extends ComponentGroup<R>, R extends AbstractDashboardComponent> implements ComponentBuilder<ComponentGroup<R>> {
    private List<ComponentBuilder<R>> children;    
    protected void child(ComponentBuilder<R> builder){
        children.add(builder);
    }
...
}

public  class ComponentGroupBuilder extends AbstractGroupComponentBuilder<ComponentGroup<AbstractDashboardComponent>, AbstractDashboardComponent>{

    public <T> TableBuilder<T> table(Class<T> clazz){
        TableBuilder<T> builder = new TableBuilder<T>(clazz);
        child(builder);  // PROBLEM HERE: The method child(ComponentBuilder<AbstractDashboardComponent>) in the type AbstractGroupComponentBuilder<ComponentGroup<AbstractDashboardComponent>,AbstractDashboardComponent> is not applicable for the arguments (TableBuilder<T>)

    }
    ...   
}

public class TableBuilder<T> implements ComponentBuilder<Table> {
...
}

public class Table extends AbstractDashboardComponent{
...
}

public class ComponentGroup<T extends AbstractDashboardComponent> extends AbstractDashboardComponent {
...
}

public interface ComponentBuilder<T extends AbstractDashboardComponent> {   
    public T build();
}
公共抽象类AbstractGroupComponentBuilder实现ComponentBuilder{
私人名单儿童;
受保护的无效子对象(ComponentBuilder){
添加(生成器);
}
...
}
公共类ComponentGroupBuilder扩展了AbstractGroupComponentBuilder{
公共TableBuilder表(clazz类){
TableBuilder=新的TableBuilder(clazz);
child(builder);//这里的问题:AbstractGroupComponentBuilder类型中的方法child(ComponentBuilder)不适用于参数(TableBuilder)
}
...   
}
公共类TableBuilder实现ComponentBuilder{
...
}
公共类表扩展了AbstractDashboardComponent{
...
}
公共类ComponentGroup扩展了AbstractDashboardComponent{
...
}
公共接口组件生成器{
公共T build();
}
因此编译器的错误是:
“AbstractGroupComponentBuilder类型中的方法子级(ComponentBuilder)不适用于参数(TableBuilder)”

为什么不兼容,因为
TableBuilder扩展了ComponentBuilder
和“Table扩展了AbstractDashboardComponent”

这里,您的构建器属于
TableBuilder
类型。这与
ComponentBuilder
不兼容。prolbem不是
组件生成器
,而是
中的内容。与普通类型不同,side
中的内容是不变的,这意味着类型必须完全匹配,不允许使用子类型

原因如下:我将使用非常简单和熟悉的类型来解释:

List<Integer> ints = new ArrayList<Integer>();
List<Number> numbers = ints; // PROBLEM LINE
numbers.add(5.0);
ints.get(0); // uhoh - that's a double and not an int!
在本例中,错误出现在第三行:您不能向
列表添加任何内容
List<Integer> ints = new ArrayList<Integer>();
List<? extends Number> numbers = ints; // this is fine
numbers.add(5.0); // PROBLEM LINE
ints.get(0); // uhoh - that's a double and not an int!
List<? super Integer> list = ...;
list.add(5); // compiles fine.
Object o = list.get(0); // all you get is `Object` here.