我有以下代码:
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>(...));
}
}
在添加段实例时,我得到一个没有合适的方法...
。看来Java的树集并没有应用PECS原则。这个问题有解决办法吗?
解决方案
我实现了:
public static <T> Segment<T> newItem(Period p, T itemValue) {
return new SegmentImpl_v1(p, itemValue);
}
在SegmentImpl_v1
中并在someFunction()
中调用它。
最佳答案
PECS 与此无关。 (您没有任何有界通配符。)
问题是SegmentImpl_v1<T>
不是 S
的子类型。当您将参数传递给方法时,它必须是参数声明类型的子类型。
关于Java TreeSet.add() 不遵循 PECS 原则问题(泛型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8016988/