注射仿制药与roboguice

时间:2013-07-12 14:14:44

标签: java guice

我正在尝试使用泛型注入实例,并且我收到以下错误:

HasOne<ModelClass> cannot be used as a key; It is not fully specified.

我在其他地方读过,最安全的方法是在使用注入器获取实例时明确命名要在泛型中使用的类,但我想要更清洁一点。我正在尝试在Relationship之间创建Models个对象。

这是我简化的Model

public class Model {

    @Inject
    Injector injector;

    public <ModelClass extends Model> HasOne<ModelClass> hasOne(Class<ModelClass> clazz) {

        HasOne<ModelClass> hasOne = injector.getInstance(Key.get(new TypeLiteral<HasOne<ModelClass>>() {
        }));

        hasOne.init(clazz);

        return hasOne;
    }
}

我的HasOne关系

public class HasOne<T extends Model> {

    Class clazz;

    public void init(Class<T> clazz){
        this.clazz = clazz;
    }

    @Inject
    Injector injector;

    public T get(){

        return (T) injector.getInstance(clazz);
    }
}

测试Model#1

public class TestModel extends Model {

    public HasOne<ExampleModel> exampleModel(){

        return hasOne(ExampleModel.class);
    }
}

测试Model#2

public class ExampleModel extends Model {
}

执行此操作时出现错误

    TestModel testModel = RoboGuice.getInjector(context).getInstance(TestModel.class);

    HasOne<ExampleModel> relationship = testModel.exampleModel();

我试图隐藏丑陋的关系创造并将其保留在Model

1 个答案:

答案 0 :(得分:2)

如果new TypeLiteral<T>() { }是类型参数,则无法使用T,它必须是完全指定的类型。幸运的是,由于你有一个Class<ModelClass>的实例,你可以这样做:

(Key<HasOne<ModelClass>>) Key.get(TypeLiteral.get(Types.newParameterizedType(HasOne.class, clazz)))

你会收到关于演员阵容的警告但是可以安全地禁止它。