[英]Using a generic type with a wildcard for its own type
這是我在Stackoverflow上遇到的第一個問題,因此,如果我做錯了什么,請告訴我,以便下次進行改進。
自從我用Java進行了一些編程甚至是一些簡單的東西以來已經有一段時間了,我仍然在學習很多關於很多特性的知識,發現閱讀本站點上的討論很有幫助。
我以為我了解泛型的工作方式,直到遇到以下問題。 我知道這不是最好的設計,或者有其他方法可以解決它,但可以說必須以這種方式完成。
(它被用作應用程序中的低層,因此我喜歡泛型與頂部的層建立連接。)
情況
Identifieable
基類由Groupable
擴展,該類可由Item
, Mutation
, Location
等擴展。
由於必須由這些東西組成小組,因此我補充道:
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.