Как связать общий класс? - PullRequest
0 голосов
/ 24 марта 2012

Когда я пытаюсь смоделировать Дао, используя 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 Ответ

3 голосов
/ 26 июля 2012

Вам нужно привязать так:

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

См. Мой блог для получения дополнительной информации.

...