Использование @Inject с универсальным типом - PullRequest
1 голос
/ 22 октября 2011

Я искал здесь, но не нашел ответа.

В моем приложении у меня есть абстрактный основной класс для моих контроллеров с некоторыми методами и свойствами.И я хочу ввести Дао автоматически.

abstract class AbstractController<E extends AbstractEntity, D extends AbstractDAO<E>> {

    @Inject
    private D dao;

    // getters and setters
}

abstract class AbstractDAO<E extends AbstractEntity> {
    @PersistentContext
    private EntityManager em;

    // finds returns E
}

// implemenation/usage

class CarController extends AbstractController<Car, CarDAO> {
}

Получение исключения:

org.jboss.weld.exceptions.DefinitionException: WELD-001407 Cannot declare an injection point with a type variable: [field] @Inject private AbstractController.dao

Использование: Glassfish 3.1 и JSF 2.1.

Существует обходной путь, альтернатива, за это?

Спасибо.

1 Ответ

2 голосов
/ 23 октября 2011

Технически очень сложно для размышления определить правильный тип среды выполнения с помощью общего объявления в источнике и привести его к нему. Сварка просто не поддерживает и не поддержит.

Лучше объявить это против AbstractDAO<E>:

private AbstractDAO<E> dao;

Вы все равно ничего не получите, объявив его против D.

...