2012-03-23 6 views
0

Когда я пытаюсь издеваться в Дао с помощью Jukito я получаю следующее исключение:Как связать класс Generic?

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

Можете ли вы уточнить свой вопрос? Неясно, в чем именно проблема. –

+0

Я переформулировал вопрос. Надеюсь, это лучше. – Sydney

+0

Не совсем. Я не знаю, Jukito, и я, возможно, не один, не могли бы вы опубликовать тест JUnit, объясняющий, где именно проблема :) – Brice

ответ

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 для более подробной информации.