Введите класс‹T› с GIN

Есть ли способ внедрить тип класса Class<T> в джин? Я не могу заставить его работать, например:

class GenericFoo<T> {

  private final Class<T> klass;

  @Inject
  public GenericFoo(Class<T> klass) {
    this.klass = klass;
  }
}

class Bar { }

с экземпляром, введенным куда-то:

..
@Inject
GenericFoo<Bar> instance;
..

и GinModule, содержащий что-то вроде строк:

bind(new TypeLiteral<Class<Bar>>() {}).to(Bar.class);

Спасибо


person ryan    schedule 17.08.2011    source источник


Ответы (2)


Это невозможно. Отражение запрещено на стороне клиента, поэтому GIN для внедрения зависимостей использует отложенное связывание. Это означает, что во время компиляции GWT генерирует целевые реализации, неизвестные в вашем случае.

person kospiotr    schedule 17.08.2011
comment
Извините, я думаю, вы меня неправильно поняли, внес правку, чтобы уточнить. Мне не нужно размышление, я просто хочу привязать Class‹Foo› к Foo.getClass(). - person ryan; 17.08.2011

Если бы это был обычный Guice (в отличие от Gin), вы могли бы сделать:

bind(new TypeLiteral<Class<Bar>>(){}).toInstance(Bar.class);

Но Gin не поддерживает привязки .toInstance(...). Вместо этого вы должны иметь возможность использовать метод Provider или @Provides, например:

@Provides
Class<Bar> providesBarClass() {
  return Bar.class;
}
person Andrew McNamee    schedule 22.08.2011