1

ジェネリックを使用してインスタンスを注入しようとしていますが、次のエラーが発生します。

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醜い人間関係の成り立ちを隠してクラスに留めようとしている

4

1 に答える 1

2

new TypeLiteral<T>() { }ifTは型パラメーターとして使用できません。完全に指定された型でなければなりません。幸いなことに、 のインスタンスがあるので、次のClass<ModelClass>ことができます。

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

キャスト時に警告が表示されますが、安全に抑制できます。

于 2013-07-12T14:32:33.930 に答える