假设我有一个接口(interface)和一些类:
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)
中将此方法重载为 LocalizedButtonsPanel
,我当然会得到类型擦除。可能是遗漏了某些模式,或者存在处理这种架构以实现正确添加 LocalizedButtons 集的技巧?
我得到了答案,我想让我的例子更具体——我的实现中有一些 validator ,所以我需要将集合类型也存储为泛型,这是我使用答案得到的简化代码:
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>
的参数类型。