将Class对象映射到通用对象

时间:2013-03-27 20:28:34

标签: java spring generics

所以我有一个抽象实体Compound和一个抽象服务CompoundService<T extends Compound>

还有另一个服务类需要访问CompoundService<T extends Compound>的任何实现(任意编号,编译时未知的实现)。这在1个特定方法中是必需的,并且该方法可以采用类参数Class<? extends Compound>

问题是如何将此类安全地映射到相应的服务类?

Map<Class<? extends Compound>, CompoundService<? extends Compound>>这样的东西不起作用,因为我要求CompoundService的泛型参数是特定的而不是通配符。

我不知道如何解释这一点。但compoundService.getById(compoundId)会返回Compound类型的T实例或compoundService.save(compound)需要compound的{​​{1}}类型实例。这意味着

T

无效,因为Map<Class<? extends Compound>, CompoundService<? extends Compound>> services = //...; CompoundService<T> compoundService = services.get(compoundClass); 无法投放到CompoundService<? extends Compound>>

嗯,不确定这是否有帮助。问题是类对象CompoundService<T>到此“类型”服务类Class<? extends Compound>的映射。

我是如何实现这一目标的?

1 个答案:

答案 0 :(得分: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);
    }

}

我不认为你会比这更好,并避免由于类型擦除而导致演员阵容