gpt4 book ai didi

java - 使用 roboguice 注入(inject)泛型

转载 作者:行者123 更新时间:2023-11-30 04:18:56 25 4
gpt4 key购买 nike

我尝试使用泛型注入(inject)实例,但收到以下错误:

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

我在其他地方读到,最安全的方法是在使用注入(inject)器获取实例时显式命名要在泛型中使用的类,但我想更简洁一些。我正在尝试在模型之间创建Relationship对象。

这是我的简化的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);
}
}

测试模型 #1

public class TestModel extends Model {

public HasOne<ExampleModel> exampleModel(){

return hasOne(ExampleModel.class);
}
}

测试模型 #2

public class ExampleModel extends Model {
}

执行此操作时出现错误

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

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

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

最佳答案

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

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

您会收到关于强制转换的警告,但可以安全地抑制它。

关于java - 使用 roboguice 注入(inject)泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617005/

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