Generics Guice、泛型和typeliteral

Generics Guice、泛型和typeliteral,generics,guava,guice,typeliteral,Generics,Guava,Guice,Typeliteral,假设我有这个: public class Foo<T> { @Inject public Foo(Class<T> tClass); } public class FooProvider<T> implements Provider<Foo<T>> { @Inject private TypeLiteral<T> type; @Override public Foo<T> get

假设我有这个:

public class Foo<T> {
    @Inject public Foo(Class<T> tClass);
}

public class FooProvider<T> implements Provider<Foo<T>> {
    @Inject private TypeLiteral<T> type;
    @Override
    public Foo<T> get() {
        Class<T> rawType = (Class<T>) type.getRawType();
        return new Foo<>(rawType);
    }
}
它会自动绑定
Foo
Foo
等,还是必须单独提供它们?还假设我不能修改
Foo
,因此它采用
TypeLiteral
而不是

相关问题:假设我有Guava的
TypeToken
(或其他类似的“TypeToken”类),我有一个提供者可以将
TypeLiteral
转换为
TypeToken
。类似的原理会起作用吗?

给定的绑定

bind(Foo.class).toProvider(FooProvider.class);
将只将类“Foo”(不指定泛型类型)绑定到提供程序。您需要使用TypeLiteral来指定泛型。您可以通过以下语句获得所需的行为:

bind(new TypeLiteral<Foo>(){}).toProvider(FooProvider.class);
bind(newtypeliteral(){}).toProvider(FooProvider.class);
试试这个:

类别:

public class Foo<T> {
    @Inject public Foo(Class<T> tClass);
}
公共类Foo{
@注入公共Foo(类tClass);
}
我猜您希望JIT在注入类时自动提供泛型类型,但这不会发生。Guice的JIT不是这样工作的。您需要绑定计划使用的每个泛型类型。请参阅以下代码片段(请注意,我们没有绑定Foo,而是绑定将被注入Foo的类):

bind(newtypeliteral(){}).toInstance(MyType.class);
要获取实例,需要将类型定义为泛型

@Inject Foo<MyType> foo
@injectfoo-Foo
要直接从注入器轮询它,需要具体说明泛型类型

injector.getInstance(Key.get((new TypeLiteral<Foo<MyType>>(){})));
injector.getInstance(Key.get((new-TypeLiteral(){}));

为什么不自己试试呢?IMO guice在处理泛型方面做得很差。有时,正确绑定泛型似乎是一个非常漫长的过程,但仍然顽固地拒绝为我编译。表示不能将
FooProvider.class
转换为
ClassI我认为这个答案解决了问题的实质,但并不能解决您的问题。请参阅我的其他答案以解决您的问题。
@Inject Foo<MyType> foo
injector.getInstance(Key.get((new TypeLiteral<Foo<MyType>>(){})));