Скажем, у меня есть интерфейс и некоторые классы:
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
, я, конечно, получу стирание типа.
Может быть, пропущен какой-то шаблон или существует хитрость, чтобы справиться с этой архитектурой для правильного добавленияset 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(); }
}
И в этом случае он работает