Java TreeSet.add()不遵循PECS原则问题(泛型)

时间:2011-11-04 23:39:55

标签: java generics treeset 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原则。这个问题有解决方案吗?

我实施了:

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

,并在SegmentImpl_v1中调用。

2 个答案:

答案 0 :(得分:1)

没有看到与PECS的关系。您麻烦的代码不会产生或消耗通用集合。你只是在用它。该集合是类型S.当然,您不能将SegmentImpl_v1放入其中。如果有人这样做会怎么样:

new TimelineImpl<Foo, SegmentImpl_v2<Foo>>  

在SortedSet中允许SegmentImpl_v1显然不正确。

答案 1 :(得分:1)

PECS与此无关。 (你没有任何有界的通配符。)

问题是SegmentImpl_v1<T>不是S的子类型。将参数传递给方法时,它必须是声明的参数类型的子类型。