簡體   English   中英

Java的TreeSet.add()不遵循PECS原則問題(泛型)

[英]Java's TreeSet.add() does not follow the PECS principle issue (Generics)

我有以下代碼:

public interface Segment<T> extends Period { ... };

public class SegmentImpl_v1<T> implements Segment<T> { ... };


public interface TimeLine<T, S extends Segment<T>> { ... };

public class TimeLineImpl<T, S extends Segment<T>>
        implements TimeLine<T, S> {

    private SortedSet<S> segments = new TreeSet<S>();

    public void someFunction() {

        // no suitable method for...
        segments.add(new SegmentImpl_v1<T>(...)); 

    }

}

當我添加一個段實例時,我得到了一個no suitable method for... 看起來Java的treeset不適用PECS原則。 這個問題有解決方案嗎?

我實施了:

public static <T> Segment<T> newItem(Period p, T itemValue) {
    return new SegmentImpl_v1(p, itemValue);
}

SegmentImpl_v1並在someFunction()調用它。

沒有看到與PECS的關系。 您麻煩的代碼不會產生或消耗通用集合。 你只是在用它。 該集合是類型S.當然,您不能將SegmentImpl_v1放入其中。 如果有人這樣做會怎么樣

new TimelineImpl<Foo, SegmentImpl_v2<Foo>>  

允許在SortedSet中使用SegmentImpl_v1顯然是不正確的。

PECS與此無關。 (你沒有任何有界的通配符。)

問題是SegmentImpl_v1<T>不是S的子類型。 將參數傳遞給方法時,它必須是聲明的參數類型的子類型。

暫無
暫無

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

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