Вопрос касательно Google Guice's TypeLiteral - PullRequest
1 голос
/ 06 сентября 2011

У меня есть несколько вопросов относительно использования TypeLiteral.

Сначала я понимаю, что вам нужно использовать TypeLiteral всякий раз, когда вы хотите связать экземпляр с общей информацией. Если вы хотите внедрить Box , вам необходимо связать bind(new TypeLiteral<Box<String>>(){}).to(BoxImpl.class), поэтому при обнаружении @Inject Box<String> мы внедряем экземпляр BoxImpl. Мой вопрос:

  1. Почему мы создаем новый экземпляр TypeLiteral всякий раз, когда нам нужно его связать? (мы обычно связываем (interface.class) .to (creation.class)

  2. Какова цель {} при создании нового экземпляра TypeLiteral при связывании? new TypeLiteral< Box< String > >(){} <- Какова цель и как это используется, чтобы помочь процессу связывания? </p>

  3. Зачем нам нужен TypeLiteral для начала?

Спасибо.

1 Ответ

2 голосов
/ 06 сентября 2011
  1. Строго необходимо создавать каждый раз каждый раз, просто обычно это удобнее, чем хранить экземпляр TypeLiteral как константу и использовать его.
  2. You 'создает анонимный подкласс TypeLiteral<Box<String>>.При этом конкретные аргументы универсального типа фиксируются для всего класса , который вы создаете, и поэтому доступны во время выполнения.
  3. Поскольку в противном случае было бы невозможно провести различие между Box<String> привязка и другая Box<Integer> привязка.

Кстати, для приведенного вами примера, я думаю, вам нужно написать:

bind(new TypeLiteral<Box<String>>(){}).to(new TypeLiteral<BoxImpl<String>>(){});

(Если только BoxImpl по какой-то причине реализует Box<String>, а не Box<T>.)

...