TreeSet.add() в Java не соответствует принципу PECS (Generics)
У меня есть следующий кусок кода:
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);
}
в SegmentImpl_v1
и позвони в someFunction()
,
2 ответа
PECS не имеет к этому никакого отношения. (У вас нет ограниченных подстановочных знаков.)
Проблема в SegmentImpl_v1<T>
не является подтипом S
, Когда вы передаете аргумент методу, он должен быть подтипом объявленного типа параметра.
Не видя отношения к УИК. Ваш проблемный код не производит или не использует универсальную коллекцию. Вы просто работаете с этим. Коллекция относится к типу S. Конечно, вы не можете поместить в нее SegmentImpl_v1. Что делать, если кто-то сделал это:
new TimelineImpl<Foo, SegmentImpl_v2<Foo>>
Разрешение SegmentImpl_v1 в SortedSet явно неверно.