2012-03-23 145 views
0

當我嘗試使用Jukito嘲笑一個島,我得到以下異常:如何綁定泛型類?

java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 
    at org.jukito.JukitoModule.addKeyDependency(JukitoModule.java:338) 
    at org.jukito.JukitoModule.addInjectionPointDependencies(JukitoModule.java:330) 
    at org.jukito.JukitoModule.addDependencies(JukitoModule.java:313) 

我試圖嘲弄的對象是ConcreteDao

public class ConcreteDao extends AbstractDao<MyDomain> { 
} 

public abstract class AbstractDao<T extends DatastoreObject> { 
} 

我對SO看了幾張貼關於這家仿製藥的結合,但我不能想出一個辦法使用TypeLiteral我結合。

這是我的嘗試:

bind(new TypeLiteral<AbstractDao<MyDomain>>(){}).to(ConcreteDao.class); 
+1

你能否詳細說明你的問題?目前還不清楚究竟是什麼問題。 – 2012-03-23 23:57:04

+0

我重新提出了這個問題。希望它更好 – Sydney 2012-03-24 09:10:07

+0

不是。我不知道Jukito,我可能並不孤單,你可以發佈一個JUnit測試來解釋究竟是哪個問題:) – Brice 2012-03-25 17:02:16

回答

3

您需要綁定這樣的:

bind(new TypeLiteral<AbstractDao<MyDomain>>(){}).to(new TypeLiteral<ConcreteDao<MyDomain>>(){}); 

這是你如何獲取泛型類:

class AbstractDao { 
    protected final Class<T> clazz; 

    @Inject 
    public AbstractDao(TypeLiteral<T> type) { 
    clazz = (Class<T>) type.getRawType(); 
    } 
} 

子類的AbstractDao將需要將實體特定TypeLiteral s傳遞給父類(AbstractDao):

class ConcreteDao extends AbstractDao<MyDomain> { 
    @Inject 
    public ConcreteDao(TypeLiteral<MyDomain> type) { 
    super(type); 
    } 
} 

請注意,你可以讓你AbstractDao的類非抽象和實現基本的CRUD操作,這樣就可以使用它,而不需要延長AbstractDao爲每個實體。你只需要像這樣每個實體的綁定:

bind(new TypeLiteral<GenericDao<User>>(){}).in(Scopes.SINGLETON); 

見我blog-post以獲取更多信息。