如何编写通用的 Guice 绑定函数?

发布于 2024-12-23 12:15:32 字数 740 浏览 1 评论 0原文

如何在下面的 Guice 绑定代码中抽象 Option 类型,并用泛型参数替换 Option

ArrayList<Class<? extends Option>> options = 
 new ArrayList<Class<? extends Option>>();
bindMultibinder(annotation, options);

public Key<Set<Option>> bindMultibinder(
 Named annotation, ArrayList<Class<? extends Option>> contents) {
   Multibinder<Option> options = 
    Multibinder.newSetBinder(binder(), Option.class, annotation);
   for (Class<? extends Option> option : contents) {
      options.addBinding().to(option);
   }
   final Key<Set<Option>> multibinderKey = 
    Key.get(new TypeLiteral<Set<Option>>(){}, annotation);
   return multibinderKey;
}

How can I abstract the Option type in the below Guice binding code, substituting a generic parameter for Option?

ArrayList<Class<? extends Option>> options = 
 new ArrayList<Class<? extends Option>>();
bindMultibinder(annotation, options);

public Key<Set<Option>> bindMultibinder(
 Named annotation, ArrayList<Class<? extends Option>> contents) {
   Multibinder<Option> options = 
    Multibinder.newSetBinder(binder(), Option.class, annotation);
   for (Class<? extends Option> option : contents) {
      options.addBinding().to(option);
   }
   final Key<Set<Option>> multibinderKey = 
    Key.get(new TypeLiteral<Set<Option>>(){}, annotation);
   return multibinderKey;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

≈。彩虹 2024-12-30 12:15:32

感谢 Google 网上论坛的 Stuart McCulloch 的回答:

^ 新的 TypeLiteral<...>(){} 匿名类技巧仅在以下情况下有效
类型参数在编译时已知。

如果您需要在运行时构建泛型类型,您可以使用
com.google.inject.util.Types 实用程序类,例如:

final Key<Set<T>> multibinderKey =
    Key.get( Types.setOf( superClass ), annotation );

为了使其正确构建,我对其进行了如下修改:

final Key<?> multibinderKey = Key.get(Types.setOf( superClass ), annotation);

所以完整的通用方法是:

public <T> Key<?> bindMultibinder(
 Named annotation, Class<T> superClass, ArrayList<Class<? extends T>> contents) {
   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;
}

Thanks to Stuart McCulloch on Google Groups for answering:

^ the new TypeLiteral<...>(){} anonymous class trick only works when
the type parameter is known at compile time.

If you need to build generic types at runtime you can use the
com.google.inject.util.Types utility class, for example:

final Key<Set<T>> multibinderKey =
    Key.get( Types.setOf( superClass ), annotation );

To get this to build correctly, I modified it as follows:

final Key<?> multibinderKey = Key.get(Types.setOf( superClass ), annotation);

So the complete generic method is:

public <T> Key<?> bindMultibinder(
 Named annotation, Class<T> superClass, ArrayList<Class<? extends T>> contents) {
   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;
}
清秋悲枫 2024-12-30 12:15:32

java.util.Set;不能作为钥匙使用;尚未完全指定。

对我来说 Guice Key 不支持使用泛型 - 你只能有完全指定的东西(即没有未绑定的类型参数)。

java.util.Set<T> cannot be used as a key; It is not fully specified.

Says to me that Guice Key doesn't support using Generics - you can only have something fully specified (i.e. with no unbound type parameters).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文