TreeSet.add () Java не соответствует принципу PECS (Generics) - PullRequest
0 голосов
/ 05 ноября 2011

У меня есть следующий фрагмент кода:

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 ]

1 голос
/ 05 ноября 2011

PECS не имеет к этому никакого отношения.(У вас нет ограниченных подстановочных знаков.)

Проблема в том, что SegmentImpl_v1<T> не является подтипом S.Когда вы передаете аргумент методу, он должен быть подтипом объявленного типа параметра.

1 голос
/ 05 ноября 2011

Не видя отношения к УИК. Ваш проблемный код не производит или не использует универсальную коллекцию. Вы просто работаете с этим. Коллекция имеет тип S. Конечно, вы не можете поместить в нее SegmentImpl_v1. Что делать, если кто-то сделал это:

new TimelineImpl<Foo, SegmentImpl_v2<Foo>>  

Разрешение SegmentImpl_v1 в SortedSet явно неверно.

...