收集的通集說我有一個接口和一些類:Java集合:孩子的父母
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
,那麼當然我會進行類型擦除。
可能是某種模式被遺漏或存在處理這種架構的技巧來實現正確添加LocalizedButton集合嗎?
我已經得到了答案,我想我的例子更具體的 - 我有我的執行一些驗證,所以我需要集合類型來存儲爲通用的,即簡化代碼我使用應答已經得到了:
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(); }
}
在這種情況下,它的工作原理
有可能是(可能)類似的問題http://stackoverflow.com/questions/298305/,但那裏的答案打破了接口我有 – 2010-08-03 11:57:53