Java';s TreeSet.add()不遵循PECS原则问题(泛型)
我有以下代码:Java';s TreeSet.add()不遵循PECS原则问题(泛型),java,generics,treeset,pecs,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
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>(...));
}
}
在
段impl\u v1中
并在someFunction()中调用它
看不到与PEC的关系。您的麻烦代码没有生成或使用泛型集合。你只是在用它。该集合是S类型。当然,您不能将SegmentImpl_v1放入其中。如果有人这样做了怎么办:
new TimelineImpl<Foo, SegmentImpl_v2<Foo>>
newtimelineimpl
允许在分类数据集中使用段impl_v1显然是不正确的。PECS与此无关。(您没有任何有界通配符。)
问题是
SegmentImpl_v1
不是S
的子类型。当您将参数传递给方法时,它必须是参数声明类型的子类型。但是SegmentImpl\u v1实现段和S扩展段,所以它们没有共同的段吗?当然,这样它们可以安全地位于SortedSet
中,但不能保证v1可以安全地位于v2的集合中。如果您想使用v2特有的方法,会发生什么?
new TimelineImpl<Foo, SegmentImpl_v2<Foo>>