2

次のように、いくつかの上限のワイルドカードを持つ変数があります。

private Map< Class< ? extends MyClass1 >, List< ? extends MyClass2< ? extends MyClass3, ? extends  MyClass1> > > _variableName;

バインドされた値? extends MyClass1がClassクラスのTypeとMyClass2クラスの2番目のパラメーターで同じになるように強制する方法はありますか?

4

1 に答える 1

3

はい:

    public class Foo<T extends MyClass1> {
        private Map< Class<T>, List<? extends MyClass2<? extends MyClass3, T>>> bar;
        ...
    }

一般的な方法でこれを行うこともできます。クラスを定義するとき、またはこのMapをインスタンス化するメソッドを呼び出すときは、保証を行う場所(さらに、Mapがインスタンス化される場所)によって異なります。

アップデート:

このマップには1つの要素しか含まれないという(正しい)観察に応えて、おそらく質問者は代わりにこれを念頭に置いていました。

    public class Foo {
        private Map<Class<? extends MyClass1>, List<? extends MyClass2<? extends MyClass3, ? extends MyClass1>>> bar;

        public <T extends MyClass1> void add(Class<T> myClass, List<? extends MyClass2<? extends MyClass3, T>>> myList) {
            bar.put(myClass, myList);
        }

        ...
    }

これがプライベートマップに要素を追加する唯一の方法であると仮定すると、タイプが常に一致することが保証されます。

于 2012-12-12T01:13:34.163 に答える