簡體   English   中英

對通配符使用通用類型

[英]Using a generic type with a wildcard for its own type

這是我在Stackoverflow上遇到的第一個問題,因此,如果我做錯了什么,請告訴我,以便下次進行改進。

自從我用Java進行了一些編程甚至是一些簡單的東西以來已經有一段時間了,我仍然在學習很多關於很多特性的知識,發現閱讀本站點上的討論很有幫助。

我以為我了解泛型的工作方式,直到遇到以下問題。 我知道這不是最好的設計,或者有其他方法可以解決它,但可以說必須以這種方式完成。
(它被用作應用程序中的低層,因此我喜歡泛型與頂部的層建立連接。)

情況
Identifieable基類由Groupable擴展,該類可由ItemMutationLocation等擴展。

由於必須由這些東西組成小組,因此我補充道:

class Group<T extends Groupable> extends Groupable
{ 

    public Group(Id id)
    {
        super(id);
        content = new HashMap<T, Integer>();
    }

    private final HashMap<T, Integer> content;
            // Additional methods for adding, removing etc.
}

我在此處添加了泛型以進行限制,以便能夠將組限制為項目,突變等。組也必須是可分組的。

因為我想知道我屬於哪個組,所以我將Groupable設計如下:

    class Groupable extends Identifieable
    {

        public Groupable(Id id)
        {
            super(id);
            partOf = new ArrayList<Group<? extends Groupable>>();
        }

        private ArrayList<Group<? extends Groupable>> partOf;

        private final ArrayList<Group<? extends Groupable>> containingGroups()
        {
              return partOf;
        }
    }

問題
“ partOf”的通用類型讓我很痛苦。 我需要返回一組擴展了Groupable的類型的列表(當然),並且間接地替代了此對象是其實例的類。 突變當然不能成為項目列表的一部分。

我已經考慮過在Groupable中使用類型參數,但這對我來說似乎不正確。 這樣,您可以實例化一個具有其類作為其父類型的Item,這是可能的,但效果並不理想。 這樣,可以返回並存儲其自身類型的組,但不能返回並存儲超類型的組。

最后
我不知道這是否清楚,我真的不知道如何通過保留所有元素來簡化問題。

如果存在一個出色的解決問題的設計,並且牢記所有這些類,那么就應該以“通用”的方式進行擴展和使用;),非常感謝。

我讀過有關僅使用原始類型的信息,但這似乎並不正確,盡管可以安全地假定不會發生任何錯誤的類型轉換。 如果有人可以用通配符解釋Java對該通用嵌套的作用以及解決此特定問題的正確方法,再次表示感謝。

我對正確的方法或理論上的解釋比對解決方法更感興趣,還沒有錯誤,因為我不知道如何實現它。

您不能規定Groupable類包含Groups的集合。 這樣做的主要原因是Group類擴展了Groupable,因此在編譯Groupable類時不知道(無法知道)。

這里還有另一個問題是(對我來說)這真的沒有意義。 例如,如果Item類擴展了Groupable類,該怎么辦。 考慮到它基本上是它的兄弟姐妹,但將它們連接起來的唯一東西是一個共同的父母,因此包含一個Groups的集合是否有意義。

我建議以這種方式修改代碼:

class Groupable extends Identifiable
{
    private ArrayList<? extends Groupable> partOf;

    public Groupable(String id)
    {
        partOf = new ArrayList<Groupable>();
    }


    private final ArrayList<? extends Groupable> containingGroups()
    {
          return partOf;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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