Digamos que tiene una interfaz y algunas clases:Java collection paso de los niños como la recolección de los padres
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(); }
}
entonces tengo un conjunto de LocalizedButtons y cuando llamo
final LocalizedButtonsPanel localizedButtonsPanel = new LocalizedButtonsPanel();
final Set<LocalizedButton> localizedButtonsSet = new LinkedHashSet<LocalizedButton>();
localizedButtonsPanel.addComponents(localizedButtonsSet);
me sale que este método no es aplicable para estos argumentos. Si trato de sobrecargar este método como addComponents(Set<LocalizedButton> buttons)
en LocalizedButtonsPanel
, obtengo borrado de tipo, por supuesto.
¿Se puede omitir algún patrón o existe el truco para tratar con esta arquitectura para implementar la adición correcta del conjunto de LocalizedButtons?
tengo la respuesta y yo quiero hacer mi ejemplo más concreto - Tengo algunos validadores en mi aplicación, así que necesito el tipo de colección que también se almacenan como genérico, que se simplifica el código I' ve consiguió usando la respuesta:
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(); }
}
Y en este caso, funciona
existe (puede haber) una pregunta similar http://stackoverflow.com/questions/298305/, pero la respuesta no funciona interfaces Tengo –