2011-05-10 228 views
4

我正在寫這個查詢服務,它假設可以使用幾個預定義的類。然而,在使用這個服務類時,我覺得這是多餘的,我需要傳遞類的類型和它自己的一個類對象。例如,查詢「聯繫」的對象,我需要同時提供和Contact.class,如下所示:關於java泛型的問題

lookupService = new MyLookupServiceImpl<Contact>(Contact.class); 

在這種情況下,有沒有辦法來初始化類不傳遞「聯繫。類」? 服務類似如下:

public class MyLookupServiceImpl<T> { 
private Class<T> cls; 

public MyLookupServiceImpl(Class<T> clz){ 
    this.cls = clz; 
} 

public T queryObject(String sql) { 
    try { 
     QueryResult result = ConnectionFactory.getConnection().query(sql); 
     if(result.getSize()>0){ 
      T obj=null; 
      MyObject sObj = result.getRecords()[0]; 
      MyObjectBuilder<T> ob = new MyObjectBuilder<T>(cls); 
      obj = ob.buildORMObject(sObj); 
      return obj; 
     } 
    } catch (ConnectionException e) { 
     logger.warn(e.toString()); 
    } 
    return null; 
} 
} 

任何建議,將不勝感激。

謝謝,

回答

3

答案是否定的。在java中,由於type erasure,在運行時沒有其他方式推斷/獲取此信息,並將類型信息作爲Class<?>實例傳遞。

0

這很可能是必需的,因爲不可能創建由類型參數指示的任意類的新實例;換句話說,你不能這樣做:

T obj = new T(); 

由於Java泛型實現(類型擦除)的方式。

請注意,在您的代碼中,cls傳遞給MyObjectBuilder<T>,這很可能是創建T的新實例的對象。 MyObjectBuilder<T>使用反射來創建的T一個新實例,用這樣的語句:

T obj = cls.newInstance(); 

參見:Create new instance of T in Java

0

巴拉是正確的(+1)很可惜。但是,如果使用依賴注入框架像Guice,你可以問吉斯傳給你一個TypeLiteral這是你感興趣的類型,你可以做這樣的事情:

public class MyLookupServiceImpl<T> { 
    private Class<T> cls; 

    @Inject 
    public MyLookupServiceImpl(TypeLiteral<T> type){ 
     this.cls = (Class<T>)type.getRawType(); 
    } 
} 

然後使用吉斯注射器來傳遞MyLookupServiceImpl的實例。只是一個想法! :)