0

だから私は抽象的な実体Compoundと抽象的なサービスを持っていますCompoundService<T extends Compound>

CompoundService<T extends Compound>(任意の数、コンパイル時に実装が不明)の実装にアクセスする必要がある別のサービス クラスがあります。これは 1 つの特定のメソッドで必要であり、そのメソッドはクラス引数を取ることができますClass<? extends Compound>

問題は、このクラスを対応するサービス クラスに型安全にマップする方法です。

ワイルドカードではなく具体的Map<Class<? extends Compound>, CompoundService<? extends Compound>>​​なジェネリックパラメーターが必要なため、次のようなものは機能しません。CompoundService

これを説明する方法がわかりません。ただし、 type のインスタンスをcompoundService.getById(compoundId)返すか、 type である必要があります。この意味はCompoundTcompoundService.save(compound)compoundT

Map<Class<? extends Compound>, CompoundService<? extends Compound>> services = //...;
CompoundService<T> compoundService = services.get(compoundClass);

CompoundService<? extends Compound>>にキャストできないため、機能しません CompoundService<T>

うーん、それが役に立ったかどうかはわかりません。Class<? extends Compound>問題は、この「タイプ」サービス クラスへの Class オブジェクトのマッピングですCompoundService<? extends Compound>

これを達成する方法はありますか?

4

1 に答える 1

1

これがあなたがやりたいことだと思います:

abstract class Compound { }

class Compound1 extends Compound { }

abstract class CompoundService<T extends Compound> {
    ...
}

class Compound1Service extends CompoundService<Compound1> {
    ...
}

public class Test {

    static Map<Class<? extends Compound>, CompoundService<? extends Compound>> serviceMap = new HashMap<Class<? extends Compound>, CompoundService<? extends Compound>>();

    public static <T extends Compound> void main(String[] args) {
        serviceMap.put(Compound1.class, new Compound1Service());
        CompoundService<Compound1> service = getServiceFromMap(Compound1.class);
        System.out.println(service.getClass());
    }

    public static <T extends Compound> CompoundService<T> getServiceFromMap(Class<T> clazz) {
        return(CompoundService<T>)serviceMap.get(clazz);
    }

}

これよりも良くなり、型消去によるキャストを回避するとは思わない

于 2013-03-27T21:13:06.057 に答える