gpt4 book ai didi

java - Android 和 Guice - 注入(inject)通用类型类?

转载 作者:行者123 更新时间:2023-12-01 04:53:28 26 4
gpt4 key购买 nike

我有一个泛型类型类。我正在尝试注入(inject)这个类,但它似乎不起作用。我发现的其他解决方案违背了泛型的全部意义,因为建议对模块中的类型进行硬编码。

@Override
protected void configure() {

this.bind(new TypeLiteral<IServiceClient<Object>>(){}).to(new TypeLiteral<ServiceClient<Object>>(){});



}

用法

@Inject IServiceClient<Customer> customerServiceClient ;

最佳答案

通常情况下,类型参数是 Key 的有用部分。 (它本身仅由 TypeLiteral 和绑定(bind)注释组成)。 Guice 预计您会想要治疗 IServiceClient<User>IServiceClient<Property>作为两个不同的绑定(bind),因此您可以轻松地使用两种不同的实现来实现它们。听起来你的情况不太具体,你想要 MyService<Foo>绑定(bind)到任何 Foo 的相同实现类.

从本质上来说,Guice 是一个从 key 到提供者的映射,因此在单个语句中绑定(bind)各种 key 并不容易。当然,您可以循环遍历IServiceProvider的不同类型参数。您打算支持,分别绑定(bind)每个,但这似乎是您预期的“违反泛型的全部要点”的解决方案。 (我不同意这已经过了要点,但同意如果您支持广泛的类作为参数,则循环有点笨拙。)

因为泛型无论如何都是通过删除来处理的,所以更好的选择可能是绑定(bind)实现类一次并将其强制转换到类的构造函数中:

class MyConsumer {
IServiceProvider<Foo> fooServiceProvider;

@SuppressWarnings("unchecked")
@Inject
MyConsumer(IServiceProvider<?> fooServiceProvider) {
this.fooServiceProvider = (IServiceProvider<Foo>) fooServiceProvider;
}
}

这样 Guice 就会反射(reflection)性地寻找相同的 IServiceProvider无论您想要什么类型,都可以实现,并且您可以自己安全地进行转换。如果您发现警告很难看,您可以将转换包装在静态方法中。

关于java - Android 和 Guice - 注入(inject)通用类型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14555087/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com