public interface IPanel { public void addComponents(Set components); public ComponentType create(); } public class Button extends Component { } public class LocalizedButton extends Button { } public class ButtonsPanel implements IPanel
然后我有一组LocalizedButtons,当我打电话
final LocalizedButtonsPanel localizedButtonsPanel = new LocalizedButtonsPanel(); final Set localizedButtonsSet = new LinkedHashSet(); localizedButtonsPanel.addComponents(localizedButtonsSet);
public interface IPanel<ComponentType extends Component, CollectionType extends Collection> extends Validated { 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> { public void addComponents(Set 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扩展了Button ,因此匹配参数Type of Set extends Button>Set extends Button> 。
你有
public class ButtonsPanel implements IPanel { public void addComponents(Set components) { ... /* uses create() */ ; } public Button create() { return new Button(); } }
应该
public class ButtonsPanel implements IPanel { public void addComponents(Set extends Button> components) { ... /* uses create() */ ; } public Button create() { return new Button(); } }