Как создать привязку по умолчанию для универсального интерфейса к универсальной реализации с GIN? - PullRequest
1 голос
/ 19 марта 2012

Я пытаюсь использовать Google GIN для нашего проекта, и я натолкнулся на случай, когда у меня есть универсальный интерфейс и общая реализация этого интерфейса:

public interface IFace<T> {
    void setEntry(T t);
}

public class Face<T> implements IFace<T> {
    public void setEntry(T t) {
    }
}

Теперь у меня есть пользователь интерфейса, который нуждается вIFace, внедренный в конструктор:

public class IFaceUser {
    private IFace<String> face;

    @Inject
    public IFaceUser(IFace<String> face) {
        this.face = face;
    }
}

Если я попытаюсь связать интерфейс с реализацией с помощью bind(IFace.class).to(Face.class);, произойдет сбой внедрения с помощью

Deferred binding result type 'IFace' should not be abstract

, поэтому GIN не найдетпривязка для IFace<String> и возвращается к IFace, используйте привязку и пытается GWT.create(IFace.class).

Я также пытался bind(new TypeLiteral<IFace>(){}).to(new TypeLiteral<Face>(){}); и bind(new TypeLiteral<IFace<?>>(){}).to(new TypeLiteral<Face<?>>(){}); безуспешно.

Я знаюЯ мог бы связать IFace<String> с Face<String>, но это могло бы привести к огромному модулю с большим количеством повторяющегося кода в нем.Можно также использовать @ImplementedBy(Face.class), но это не вариант.

Есть ли волшебная комбинация bind(...).to(...), которую мне нужно использовать?Это возможно даже с GIN?

1 Ответ

1 голос
/ 21 марта 2012

Кажется, это невозможно с GIN.

Есть несколько обходных путей:

  • Пусть GIN вводит IFace или IFace, а затем приводит к нужному типу
  • Напишите фабрику для IFace с добавленным провайдером, который выполняет приведение в общем методе фабрики. Внедрите эту фабрику и получите от фабрики безопасный тип IFace.
...