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);
}

SegmentImpl_v1それを呼び出しますsomeFunction()

4

2 に答える 2

1

PECS はこれとは何の関係もありません。(バインドされたワイルドカードはありません。)

問題はSegmentImpl_v1<T>のサブタイプではないことですS。メソッドに引数を渡すときは、宣言されたパラメーターの型のサブタイプである必要があります。

于 2011-11-05T02:30:32.423 に答える
1

PECS との関係が見られない。問題のあるコードは、ジェネリック コレクションを生成または消費していません。あなたはそれを扱っているだけです。コレクションは S 型です。もちろん、SegmentImpl_v1 を入れることはできません。誰かがこれをした場合:

new TimelineImpl<Foo, SegmentImpl_v2<Foo>>  

SortedSet で SegmentImpl_v1 を許可することは明らかに正しくありません。

于 2011-11-04T23:59:49.603 に答える