簡體   English   中英

從Java中的抽象項目類訪問通用容器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM