Google guice использует new TypeLiteral<C<T>>() {}
для преодоления тот факт, что мы не можем использовать C<T>.class
.
Теперь это общее для следующего:
bind(new TypeLiteral<C<T>>() {}).to(MyCSubclassTypedToT.class);
Однако представьте себе другой сценарий. У нас есть общий интерфейс, который мы хотим внедрить, и реализация, которую мы имеем, обеспечивается универсальным классом.
Guice позволяет вам сделать это следующим образом:
bind(new TypeLiteral<MyGenericInterface<T>>() {}).to(new TypeLiteral<MyGenericClass<T>>() {});
Другой способ сделать это состоит в том, чтобы расширить MyGenericClass следующим образом:
MyTypedClass extends MyGenericClass<T>
и затем связать его следующим образом:
bind(MyGenericInterface<T>>() {}).to(MyTypedClass.class);
Если MyGenericInterface вводится много (, хотя и с разными types ), и каждый раз, когда я его внедряю, я использую MyGenericClass, последний подход приводит к чрезмерно многословному коду. Поэтому я склоняюсь к использованию первого.
Мне было бы очень интересно узнать мнение других людей об использовании TypeLiteral в предложении to привязки guice. Я боюсь, что я мог бы немного зашортить и, таким образом, не вижу ловушек этого подхода.