我有以下代码:
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
中调用。
答案 0 :(得分:1)
没有看到与PECS的关系。您麻烦的代码不会产生或消耗通用集合。你只是在用它。该集合是类型S.当然,您不能将SegmentImpl_v1放入其中。如果有人这样做会怎么样:
new TimelineImpl<Foo, SegmentImpl_v2<Foo>>
在SortedSet中允许SegmentImpl_v1显然不正确。
答案 1 :(得分:1)
PECS与此无关。 (你没有任何有界的通配符。)
问题是SegmentImpl_v1<T>
不是S
的子类型。将参数传递给方法时,它必须是声明的参数类型的子类型。