【问题标题】:Binding generics with wildcard in Guice在 Guice 中使用通配符绑定泛型
【发布时间】:2012-07-31 21:02:59
【问题描述】:

我正在尝试将Class<? extends SuperClass> 绑定到SubClass.class,但我找不到任何合适的东西。

实际上我的绑定需要在Set<Class<? extends SuperClass>> 中,所以我已经测试了普通绑定和多重绑定,但是我不能让它们中的任何一个正常工作。我想我正确地遵循了这个问题:Using Guice, how can I inject a bounded-wildcard class? 但我不太确定,因为我的测试没有通过。

import static java.util.Collections.*;
import static org.junit.Assert.*;
import java.util.Set;
import org.junit.Test;
import com.google.inject.*;
import com.google.inject.multibindings.Multibinder;

public class GuiceWildcardTest {

    @Test public void binderShouldBindClassWithWildcard() {
        Guice.createInjector(new AbstractModule() {
            @Override protected void configure() {
                bind(new TypeLiteral<Class<? extends SuperClass>>() {}).toInstance(SubClass.class);
                ClassHolder holder = new ClassHolder();
                requestInjection(holder);
                assertEquals(SubClass.class, holder.type);
            }
        });
    }

    @Test public void multibinderShouldBindSetOfClassesWithWildcard() {
        Guice.createInjector(new AbstractModule() {
            @Override protected void configure() {
                Multibinder.newSetBinder(binder(), new TypeLiteral<Class<? extends SuperClass>>() {}).addBinding().toInstance(SubClass.class);
                SetHolder holder = new SetHolder();
                requestInjection(holder);
                assertEquals(singleton(SubClass.class), holder.types);
            }
        });
    }

    static class SuperClass {}

    static class SubClass extends SuperClass {}

    static class ClassHolder {
        @Inject Class<? extends SuperClass> type;
    }

    static class SetHolder {
        @Inject Set<Class<? extends SuperClass>> types;
    }
}

【问题讨论】:

  • 我不认为你的意思是TypeLiteral&lt;Class&lt;? extends Superclass&gt;&gt;,而是TypeLiteral&lt;? extends Superclass&gt;
  • 我不知道:我想要一组类,就像我的示例中的 SetHolder 类一样定义。我不想要一组实例。
  • 好的,我明白了。如果我完全等待创建注入器,那没关系。但是如果我requestInjection(a)我的对象并直接检查被注入者,那么它就会失败。

标签: java guice


【解决方案1】:

我的问题是我没有等待注射器完成。 requestInjection() 可以解决问题,但是之后会创建 Injector,因此不会在调用 requestInjection() 之后立即创建。

此代码有效:

import static java.util.Collections.*;
import static org.junit.Assert.*;

import java.util.Set;

import org.junit.Test;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.TypeLiteral;
import com.google.inject.multibindings.Multibinder;

public class GuiceWildcardTest {

    @Test public void binderShouldBindClassWithWildcard() {
        final ClassHolder holder = new ClassHolder();
        Guice.createInjector(new AbstractModule() {
            @Override protected void configure() {
                bind(new TypeLiteral<Class<? extends SuperClass>>() {}).toInstance(SubClass.class);
                requestInjection(holder);
            }
        });
        assertEquals(SubClass.class, holder.type);
    }

    @Test public void multibinderShouldBindSetOfClassesWithWildcard() {
        final SetHolder holder = new SetHolder();
        Guice.createInjector(new AbstractModule() {
            @Override protected void configure() {
                Multibinder.newSetBinder(binder(), new TypeLiteral<Class<? extends SuperClass>>() {}).addBinding().toInstance(SubClass.class);
                requestInjection(holder);
            }
        });
        assertEquals(singleton(SubClass.class), holder.types);
    }

    static class SuperClass {}

    static class SubClass extends SuperClass {}

    static class ClassHolder {
        @Inject Class<? extends SuperClass> type;
    }

    static class SetHolder {
        @Inject Set<Class<? extends SuperClass>> types;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多