关于 Google Guice 的 TypeLiteral 的问题

发布于 2024-12-03 11:27:35 字数 609 浏览 0 评论 0 原文

我有一些关于 TypeLiteral 的使用的问题。

首先,我知道每当您想要将实例与通用信息绑定时,您都需要使用 TypeLiteral。如果要注入Box<字符串>你需要绑定 bind(new TypeLiteral>(){}).to(BoxImpl.class) 所以当你遇到 @Inject Box > 我们注入实例 BoxImpl。 我的问题是:

  1. 为什么每当我们需要绑定它时都要创建 TypeLiteral 的新实例? (我们通常是bind(interface.class).to(implementation.class)

  2. 绑定时创建TypeLiteral的新实例{}的目的是什么?new TypeLiteral >(){} <-- 目的是什么?如何使用它来帮助绑定过程?

  3. 为什么我们需要 TypeLiteral?

谢谢。

I have a few question regarding use of TypeLiteral.

First I understand that you need to use TypeLiteral whenever you want to bind instance with generic information. If you want to inject Box< String > you need to bind bind(new TypeLiteral<Box<String>>(){}).to(BoxImpl.class) so when you encounter @Inject Box<String> we inject instance BoxImpl.
My question is:

  1. Why are we creating the new instance of TypeLiteral whenever we need to bind it?
    (we usually bind(interface.class).to(implementation.class)

  2. What is the purpose of {} when creating the new instance of TypeLiteral when binding? new TypeLiteral< Box< String > >(){} <--
    What is the purpose and how is this used to help the binding process?

  3. Why do we need TypeLiteral to begin with?

Thanks.

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

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

发布评论

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

评论(1

过去的过去 2024-12-10 11:27:35
  1. 并不是每次都必须创建一个新实例,只是通常比将 TypeLiteral 实例作为常量存储在某处并使用它更方便。
  2. 您正在创建 TypeLiteral> 的匿名子类。通过这样做,特定的泛型类型参数对于您正在创建的整个类来说是固定的,因此在运行时可用。
  3. 因为否则将无法区分 Box 绑定和不同的 Box 绑定。

顺便说一句,对于您给出的示例,我认为您需要编写:(

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

除非 BoxImpl 由于某种原因实现了 Box 本身,而不是 。)

  1. It's not strictly necessary to create a new instance each time, it's just generally more convenient to do that than to store the TypeLiteral instance as a constant somewhere and use that.
  2. You're creating an anonymous subclass of TypeLiteral<Box<String>>. By doing so, the specific generic type arguments are fixed for the whole class you're creating and as such available at run time.
  3. Because otherwise it would be impossible to differentiate between a Box<String> binding and a different Box<Integer> binding.

By the way, for the example you gave I think you'd need to write:

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

(Unless BoxImpl implements Box<String> itself for some reason, as opposed to Box<T>.)

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