1

質問の言い方がよくわからないので、例を挙げます。

たとえば、次のマップをご覧ください。

Map<Class<? extends DatabaseEntry>, Class<? extends IDecorator<? extends DatabaseEntry>>> map;

たとえばMyClassDatabaseEntryそのIDecorator<MyClass>. 上記のステートメントの問題は、あまりにも具体的でないことです。もっとタイプセーフが欲しい。このようなもの:

Map<Class<T extends DatabaseEntry>, Class<? extends IDecorator<T>>> map;

もちろん、 T はエントリごとに異なりますが、私が望むのは、次のように呼び出す場合です。

map.get(MyClass.class);

戻り値の型はIDecorator<MyClass>代わりになりますIDecorator<? extends DatabaseEntry>

それに対する簡単な解決策はありますか?

4

2 に答える 2

3

@zaske が彼の答えですでに指摘しているように、これは不可能のようです。

あなたがすでに考えていることの線に沿って、必要なものとして汎用化されたメソッドをMap提供するクラスにまとめることができます。getput

public class MapWrapper { 

    Map<Class<? extends DatabaseEntry>, Class<? extends IDecorator<? extends DatabaseEntry>>> map;
    public <T extends DatabaseEntry> Class<IDecorator<T>> put (Class<T> k, Class<IDecorator<T>> v){
        return (Class<IDecorator<T>>) map.put(k,v);
    }

    public <T extends DatabaseEntry> Class<IDecorator<T>> getObject(Class<T> k) {
        return (Class<IDecorator<T>>) map.get(k);
    }
}
于 2012-12-07T13:52:06.370 に答える
2

私の知る限り、それを行う方法はありません。
もちろん T を使用することはできません。T は一般的な定義の一部である必要があり、
そのような変数のスタンドアロンの定義に含めることはできません。これがワイルドカード ( ? ) の目的です。
あなたのマップはクラスのキーと値のオブジェクトを取っているので、キーと値
の型を拡張するだけではこれを解決することさえできません(クラスは最終的なものです)。

于 2012-12-07T13:19:17.193 に答える