2013-03-27 86 views
0

所以我有一個抽象實體Compound和一個抽象服務CompoundService<T extends Compound>將類對象映射到通用對象

還有另一個服務類需要訪問CompoundService<T extends Compound>(任意編號,實現未知的編譯時)的任何實現。這在1個特定的方法中是必需的,並且該方法可以採用類參數Class<? extends Compound>

問題是如何將類安全地映射到相應的服務類?

類似​​不起作用,因爲我需要CompoundService的通用參數是特定的而不是通配符。

我不知道如何解釋這一點。但是compoundService.getById(compoundId)返回Compound類型的實例TcompoundService.save(compound)要求compound的類型爲T。這意味着,

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

不起作用爲CompoundService<? extends Compound>>不能轉換爲CompoundService<T>

嗯,不知道這是否有幫助。問題是Class對象Class<? extends Compound>到這個「types」服務類別CompoundService<? extends Compound>的映射。

任何想法,我可以如何實現這一點?

回答

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

} 

我不認爲你會得到比這更好,避免投由於類型擦除