Я пытаюсь использовать 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?