并行类层次结构上下文中的Java泛型问题

并行类层次结构上下文中的Java泛型问题,java,generics,Java,Generics,我在设计并行类层次结构时遇到了一些编译器错误。这个问题似乎源于Java的限制(与C++不同),Java没有公共的“typedef”来允许从泛型类外部访问类型参数。我想下面的示例代码最好地说明了我的问题 public interface Bean { } public class GreenBean implements Bean { } public class RedBean implements Bean { } // All BreanCounter classes implement

我在设计并行类层次结构时遇到了一些编译器错误。这个问题似乎源于Java的限制(与C++不同),Java没有公共的“typedef”来允许从泛型类外部访问类型参数。我想下面的示例代码最好地说明了我的问题

public interface Bean { }
public class GreenBean implements Bean { }
public class RedBean implements Bean { }

// All BreanCounter classes implement this interface and interact with their
// corresponding concrete bean classes. 
public interface BeanCounter <B extends Bean> {
     public void addBean(B bean);
     public Collection<B> getBeans();
}

// DefaultBeanCounter implements logic shared by GreenBeanCounter and RedBeanCounter
public class DefaultBeanCounter <B extends Bean> implements BeanCounter<B> {

    private List<B> beans = new ArrayList<B>();

    @Override
    public void addBean(B bean) { beans.add(bean); }

    @Override
    public Collection<B> getBeans() { return beans; }
}

public class GreenBeanCounter extends DefaultBeanCounter<GreenBean> { }
public class RedBeanCounter extends DefaultBeanCounter<RedBean> { }
公共接口Bean{}
公共类GreenBean实现Bean{}
公共类RedBean实现Bean{}
//所有BreanCounter类都实现此接口并与它们的
//对应的具体bean类。
公共接口BeanCounter{
公共无效addBean(B bean);
公共集合getBeans();
}
//DefaultBeanCounter实现GreenBeanCounter和RedBeanCounter共享的逻辑
公共类DefaultBeanCounter实现BeanCounter{
私有列表bean=newarraylist();
@凌驾
public void addBean(B bean){beans.add(bean);}
@凌驾
公共集合getBeans(){return beans;}
}
公共类GreenBeanCounter扩展了DefaultBeanCounter{}
公共类RedBeanCounter扩展了DefaultBeanCounter{}
使用上述设置时,编译器会抱怨以下代码:

public class BeanCounterMaster <C extends BeanCounter<? extends Bean>> {
    public void mergeBeans(C des, C src) {
        for (Bean bean : src.getBeans()) {
            des.addBean(bean); //compiler error on this line
        }
    }
}

public class BeanCounterMaster当使用just
C extends beanCounter时,我假设静态方法解决方案仍然要求类接受两个类型参数,是吗?@mr49否,它(像任何静态方法一样)可以在任何地方声明-这就是为什么我说它可以“只是”一个静态方法,因为它不需要实例化一个对象来调用它。啊,我明白了。在实际的代码中,我不能真正使这个逻辑是静态的。在某些时候,我需要从实例化方法的非静态方法调用静态方法。在那里我又遇到了类似的问题。@mr49这是可以理解的。我只是想作为一个可能的例子。
public interface BeanCounter <B extends Bean> {
    public void mergeBeans(BeanCounter<B> anotherCounter);
}

public class DefaultBeanCounter <B extends Bean> implements BeanCounter<B> {
    @Override
    public void mergeBeans(BeanCounter<B> anotherCounter) {
        for (B bean : anotherCounter.getBeans())
            addBean(bean);
    }
}
public class BeanCounterMaster <C extends BeanCounter<? extends Bean>> {
    public void mergeBeans(C des, C src) {
        des.mergeBeans(src); // Still got compiler error
    }
}
public class BeanCounterMaster <C extends BeanCounter<B>, B extends Bean> {
    public void mergeBeans(C des, C src) {
        for (B bean : src.getBeans()) {
            des.addBean(bean);
        }
    }
}
public static <B extends Bean> mergeBeans(
        BeanCounter<B> des,
        BeanCounter<? extends B> src
) {
    for (B bean : src.getBeans()) {
        des.addBean(bean);
    }
}