2011-11-04 20 views
0

,我有以下的代碼:Java的TreeSet.add()不按照PECS原則問題(仿製藥)

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原則。有沒有解決這個問題的方法?

SOLUTION

我實現:

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

SegmentImpl_v1並調用它someFunction()

回答

1

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

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

1

沒有看到與PECS的關係。您的麻煩代碼不會生成或使用通用集合。你只是在使用它。該集合是類型S.當然,你不能把一個SegmentImpl_v1放入它。如果有人這樣做:

new TimelineImpl<Foo, SegmentImpl_v2<Foo>> 

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

+0

但SegmentImpl_v1實施段和S延伸段,所以他們沒有共同段? – JVerstry

+0

當然,他們都可以安全地在'SortedSet >'中,但是不能保證v1可以安全地存在於一組v2中。如果您想使用v2獨有的方法,會發生什麼情況? – Affe