簡體   English   中英

具有泛型的Java復合設計模式

[英]java composite design pattern with generics

我有兩個通用的接口, IComparable<T> ,使用方法public boolean gt(T t)ICombinable<T> ,使用方法public T combine(T t) ICombinable<T> public T combine(T t) ,第三個接口IPreferenceValue<T>擴展了這兩個接口接口(即IPreferenceValue<T> extends IComparable<T>, ICombinable<T> ,以便可以比較類型T的優先級值並將其與其他T組合。 我有兩個IPreferenceValue的具體實現,一個是單值實現: IntegerValue implements IPreferenceValue<IntegerValue> ,另一個是首選項值列表: PreferenceVector<S extends IPreferenceValue<S>> implements IPreferenceValue<PreferenceVector<S>>

在其他地方,我有一種算法可以對IPreferenceValues執行各種操作,並且我想通過接口以相同的方式(如“復合設計模式”)來處理單值和列表值的Preference值。 我還想擁有一種工廠,該工廠將基於某些參數創建IPreferenceValues,即創建一個單值對象或創建一個列表值對象。 但是,當我創建這些PreferenceValues時,我並不關心Parameter類型,我只想創建IPreferenceValue類型的對象,工廠將返回具體的實現-並僅使用接口與對象進行交互。

但是,我在使它起作用方面有些困難。 首先,如果我使用原始類型IPreferenceValue聲明值,則會收到以下警告-“ IPreferenceValue is a raw type. References to generic type IPreferenceValue<T> should be parameterized ”。 這些警告可以避免嗎? 在其他地方,將它們聲明為IPreferenceValue<?> ,出現以下錯誤: The method gt(capture#6-of ?) in the type IComparable<capture#6-of ?> is not applicable for the arguments (IPreferenceLevel<capture#7-of ?>) 任何建議或指針都非常感謝...

編輯:在這里我得到第二個錯誤( The method gt(capture#12-of ?) in the type IComparable<capture#12-of ?> is not applicable for the arguments (IPreferenceLevel<capture#13-of ?>)

private IPreferenceLevel<?> calculateMinValue()
{
    IPreferenceLevel<?> min = null;
    for (IPreferenceLevel<?> value : tupleToValueMap.values())
    {
        if ((min == null) || (min.gt(value).equals(Comparison.TRUE)))
        {
            min = value;
        }
    }
    return min;
}

但是,即使我為此方法輸入了一種類型,即,如果我按如下方式重寫-

private <X> IPreferenceLevel<X> calculateMinValue()
{
    IPreferenceLevel<X> min = null; ...

這仍然無法編譯- The method gt(X) in the type IComparable<X> is not applicable for the arguments (IPreferenceLevel<capture#10-of ?>)

您沒有為特定的錯誤情況提供足夠的背景信息,以使我能夠明確指出問題所在。 因此,我將不得不給出更多一般性的指示。

首先,原始類型警告是正確的。 原始類型可以說僅是為了向后兼容而存在,並且您永遠不應在新代碼中使用它們。 IPreferenceValue始終具有泛型類型-如果您不知道它是什么並且不在乎,請像已經完成的一樣將其作為IPreferenceValue<?>返回。 很好,基本上可以傳達您不知道/不在乎該參數的信息。 (當然,如果您知道它可能是什么,那么一定要提供一個更具體的參數。)

第二個錯誤似乎是合法的-您需要傳遞T但是您試圖傳遞IPreferenceValue<T>

但是,一旦解決此問題,仍然會有問題。 潛在的錯誤以完全不同的方式發生,對於泛型來說並不太常見。 您有對IPreferenceValue<?>的引用,並嘗試調用其gt方法,該方法定義為采用T 但是您剛剛說過,您完全不知道該對象的T是什么(這就是為什么使用通配符的原因)-如果您不知道泛型參數是什么,那么如何將任何信息傳遞給它並知道它是正確的類型?

具體來說,您正在嘗試將tupleToValueMap的內容相互比較。 為了合法地執行此操作,它們的通用類型參數必須相同-如何將IPreferenceLevel<IntegerValue>IPreferenceLevel<PreferenceVector<S>>

因此,您應該更具體地聲明tupleToValueMap的類型,為優先級提供一個具體的通用參數,而不是? 如果事實證明您由於在其中放置了多種類型的首選項級別而無法執行此操作,那么編譯器錯誤是正確的,您將無法安全地將它們相互比較。

暫無
暫無

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

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