0

我有以下代码:

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 的树集没有应用 PECS 原则。这个问题有解决方案吗?

解决方案

我实现了:

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

inSegmentImpl_v1并调用它someFunction()

4

2 回答 2

1

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

new TimelineImpl<Foo, SegmentImpl_v2<Foo>>  

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

于 2011-11-04T23:59:49.603 回答
1

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

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

于 2011-11-05T02:30:32.423 回答