2013-07-12 30 views
1

注入泛型我想使用泛型注入情況下,我得到以下錯誤:與roboguice

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

我讀過其他地方最安全的方式做到這一點是明確命名類在使用注入器來獲取實例時用於通用,但我想成爲一個小清潔工。我試圖在Models之間創建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); 
    } 
} 

測試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

回答

2

不能使用new TypeLiteral<T>() { }如果T是一種得到錯誤參數,它必須是完全指定的類型。幸運的是,因爲你有Class<ModelClass>一個實例,你可以這樣做:

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

你會得到投一個警告,但它是安全的鎮壓。

+0

輝煌!謝謝! – David

+0

+1000。宏偉的迴應,我一直在尋找這個解決方案來解決我的問題,我不知道什麼時候。我幾乎到了將Autofac改編爲Android的時候了。 – Joseph