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