Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java';s TreeSet.add()不遵循PECS原则问题(泛型)_Java_Generics_Treeset_Pecs - Fatal编程技术网

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>>