Java集合:将子集合传递为父集合

2024-05-01

假设我有一个接口和一些类:

public interface IPanel<ComponentType extends Component> {
   public void addComponents(Set<ComponentType> components);
   public ComponentType create();
}

public class Button extends Component { }

public class LocalizedButton extends Button { }

public class ButtonsPanel implements IPanel<Button> {
    public void addComponents(Set<Button> components) { ... /* uses create() */ ; }
    public Button create() { return new Button(); }
}

public class LocalizedButtonsPanel extends ButtonsPanel {
    public Button create() { return new LocalizedButton(); }
}

然后我有一组 LocalizedButtons 当我打电话时

final LocalizedButtonsPanel localizedButtonsPanel = new LocalizedButtonsPanel();
final Set<LocalizedButton> localizedButtonsSet = new LinkedHashSet<LocalizedButton>();
localizedButtonsPanel.addComponents(localizedButtonsSet);

我知道这个方法不适用于这个参数。 如果我尝试将此方法重载为addComponents(Set<LocalizedButton> buttons) in LocalizedButtonsPanel,当然,我得到了类型擦除。

可能会遗漏某些模式,或者存在处理此架构以实现正确添加 LocalizedButtons 集的技巧?


我已经得到了答案,我想让我的示例更加具体 - 我的实现中有一些验证器,所以我需要将集合类型也存储为通用类型,这是我使用答案得到的简化代码:

public interface IPanel<ComponentType extends Component, CollectionType extends Collection<? extends Component>> extends Validated<CollectionType> {
   public void addComponents(CollectionType components);
   public ComponentType create();
}

public class Button extends Component { }

public class LocalizedButton extends Button { }

public class ButtonsPanel implements IPanel<Button, Set<? extends Button>> {
    public void addComponents(Set<? extends Button> components) { ... /* uses create() */ ; }
    public Button create() { return new Button(); }
}

public class LocalizedButtonsPanel extends ButtonsPanel {
    public Button create() { return new LocalizedButton(); }
}

在这种情况下,它有效


将 addComponents() 签名更改为

public void addComponents(Set<? extends Button> components)

以便这些方法接受 Button 的子类集。 这样,您可以通过Set<LocalizedButton>作为论证,因为LocalizedButton延伸Button因此匹配参数类型Set<? extends Button>.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java集合:将子集合传递为父集合 的相关文章

随机推荐