2

我正在努力实现 DI,特别是使用 guice 的构造函数注入。我很难理解如何将泛型类的类型注入构造函数。

我的班级如下:

public class Foo<T> {

    private Class<T> clazz;

    Foo(Class<T> clazz) {
        this.clazz = clazz;
    }
}

我可以使用 guice 在运行时将类的类型注入到构造函数中吗?简单地说,我可以使用 guice 注入 Foo 构造函数吗?

4

2 回答 2

2

是的,您可以使用 Guice 的内置 s 注入来做到这一点TypeLiteral

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector();

        Test<Integer> testInt = injector.getInstance(Key.get(new TypeLiteral<Test<Integer>>() {}));
        testInt.action();

        Test<String> testString = injector.getInstance(Key.get(new TypeLiteral<Test<String>>() {}));
        testString.action();
    }

    public static class Test<T> {
        private final Class<? super T> clazz;

        @Inject
        public Test(TypeLiteral<T> literal) {
            this.clazz = literal.getRawType();
        }

        public void action() {
            System.out.println(clazz);
        }
    }
}

不过,我不太确定为什么会getRawType()返回Class<? super T>,而不是Class<T>

于 2013-06-24T18:45:28.543 回答
2

利用

bind(new TypeLiteral<Class<SomeClass>>() {}).toInstance(SomeClass.class);

配置 Guice 注入SomeCLass.class到构造函数中

Foo<SomeClass>

于 2016-01-13T09:55:34.060 回答