以下通用吉斯結合方法正確行爲:我的TypeLiteral等價於這種通用Guice綁定方法有什麼問題?
<T> Key<?> bindMultibinder(
ArrayList<Class<? extends T>> contents, Class<T> superClass) {
Named annotation = randomAnnotation();
Multibinder<T> options =
Multibinder.newSetBinder(binder(), superClass, annotation);
for (Class<? extends T> t : contents) {
options.addBinding().to(t);
}
final Key<?> multibinderKey = Key.get(Types.setOf(superClass), annotation);
return multibinderKey;
}
並採用客戶端代碼是這樣的:
ArrayList<Class<? extends Option>> options =
new ArrayList<Class<? extends Option>>();
options.add(CruiseControl.class);
bindMultibinder(options, Option.class);
但是,如果我想允許Option
採取泛型參數一樣Option<Radio>
,那麼我想我需要通過bindMultibinder
superClass參數中的TypeLiteral
。這是迄今爲止我最好的嘗試:
<T> Key<?> bindMultibinder(
ArrayList<TypeLiteral<? extends T>> contents, TypeLiteral<T> superClass) {
Named annotation = randomAnnotation();
Multibinder<T> options =
Multibinder.newSetBinder(binder(), superClass, annotation);
for (TypeLiteral<? extends T> t : contents) {
options.addBinding().to(t);
}
final Key<?> multibinderKey = Key.get(Types.setOf(superClass.getRawType()), annotation);
return multibinderKey;
}
結合相當於現有情況下,代碼如下所示:
ArrayList<TypeLiteral<? extends Option>> options =
new ArrayList<TypeLiteral<? extends Option>>();
options.add(new TypeLiteral<CruiseControl>(){});
bindMultibinder(options, new TypeLiteral<Option>(){});
我幾乎可以肯定的是,下面的結合是不正確的,因爲Types.setOf(superClass.getRawType())
返回ParameterizedType
final Key<?> multibinderKey =
Key.get(Types.setOf(superClass.getRawType()), annotation);
任何想法如何正確創建集?
如果我不是獨自一人在地下室工作,我會爲您提供一個高薪的高級職位。 :)感謝您的驚人答案。自從我寫了這個問題以來,幸運的是我對泛型的理解和Guice的鍵的目的已經越來越深。我最終將添加番石榴(這是在我的雷達,我通過谷歌Gimlet間接包括它)。如果在第一次過渡到Scala之後仍然有意義,我會採用它。 – 2012-03-13 14:35:50