[英]Accessing generic container from abstract item-class in java
我正在嘗試實現一個通用的容器。 所有可能的項目類共享一個單一的抽象基類,該抽象基類提供對周圍容器的訪問。
以下代碼顯示了我最簡單的方法:
public class GenericContainerProblem {
public static void main(String[] args) {
Container<SpecificItem> container = new Container<>();
new SpecificItem(container);
}
private static class Container<ItemType extends AbstractItem> {
private final List<ItemType> list = new ArrayList<>();
public Container() {
//
}
protected void addItem(ItemType specificItem) {
list.add(specificItem);
}
}
private static abstract class AbstractItem {
protected final Container<? extends AbstractItem> container;
public AbstractItem(Container<? extends AbstractItem> container) {
this.container = container;
container.addItem(this); // fails *
}
}
private static class SpecificItem extends AbstractItem {
public SpecificItem(Container<SpecificItem> container) {
super(container);
container.addItem(this); // succeeds
}
}
}
*)錯誤: The method addItem(capture#3-of ? extends GenericContainer.AbstractItem) in the type GenericContainer.Container<capture#3-of ? extends GenericContainer.AbstractItem> is not applicable for the arguments (GenericContainer.AbstractItem)
The method addItem(capture#3-of ? extends GenericContainer.AbstractItem) in the type GenericContainer.Container<capture#3-of ? extends GenericContainer.AbstractItem> is not applicable for the arguments (GenericContainer.AbstractItem)
由於聲明允許的類型不匹配,因此無法正常工作? extends AbstractItem
? extends AbstractItem
。 我想我需要某種類型的約束告訴編譯器的Container<?>
內使用型AbstractItem
有效期為this
。
如何以可以訪問有關特定子類通用的容器的方式聲明/調用AbstractItem
-class(及其構造函數)?
據我所知,您需要使AbstractItem為泛型,以便指定其使用的容器的類型。 您還需要在AbstractItem構造函數中使用未經檢查的強制轉換。
但是,您真的確定要在容器和容器之間建立雙向關聯嗎? 也許您應該重新考慮這種設計。
public class GenericContainerProblem {
public static void main(String[] args) {
Container<SpecificItem> container = new Container<>();
new SpecificItem(container);
}
private static class Container<ItemType extends AbstractItem<ItemType>> {
private final List<ItemType> list = new ArrayList<>();
public Container() {
//
}
protected void addItem(ItemType specificItem) {
list.add(specificItem);
}
}
private static abstract class AbstractItem<T extends AbstractItem<T>> {
protected final Container<T> container;
public AbstractItem(Container<T> container) {
this.container = container;
container.addItem((T) this);
}
}
private static class SpecificItem extends AbstractItem<SpecificItem> {
public SpecificItem(Container<SpecificItem> container) {
super(container);
container.addItem(this);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.