2016-01-24 13 views
0

用下面的一行代碼:反向的.class以原班型

List<Dao<?>> genericList = Dao.get(Person.class, q); 

我調用下面的靜態方法:

/** 
* Dynamically create list of generic Dao's 
* @param className 
* @return 
*/ 
public static List<Dao<?>> get(Class<?> classType, Query q){ 

    List<Dao<?>> list = new ArrayList<>(); 

    try { 
     List<Map<String, Object>> results = Model.getAll(q); 

     for (Map<String, Object> map : results) { 
      Dao<?> obj = PojoFactory.createPojo(classType.getSimpleName()); 
      for (String key : map.keySet()) { 
       //Double check if field names exist before setting them 

       //http://commons.apache.org/proper/commons-beanutils/ 
       BeanUtils.setProperty(obj, key, map.get(key)); 
      } 
      list.add(obj); 
     } 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 

    return list; 
} 

而不是返回DAO類的,我想回國正確的類型,以便我不需要後來施放。
爲了做到這一點,我需要能夠扭轉:

Person.class 

這一行適應:

List<Dao<?>> genericList = Dao.get(Person.class, q); 

爲正確的類型,這樣我可以這樣調用:

List<Person> genericList = Dao.get(Person.class, q); 

任何想法?

回答

0

您應該在方法頭中引入一個類型參數。

public static <T extends Dao<T>> List<T> get(Class<T> classType, Query q){ 

    List<T> list = new ArrayList<>(); 

    try { 
     List<Map<String, Object>> results = Model.getAll(q); 

     for (Map<String, Object> map : results) { 
      T obj = (T) PojoFactory.createPojo(classType.getSimpleName()); 
      for (String key : map.keySet()) { 
       //Double check if field names exist before setting them 

       //http://commons.apache.org/proper/commons-beanutils/ 
       BeanUtils.setProperty(obj, key, map.get(key)); 
      } 
      list.add(obj); 
     } 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 

    return list; 
} 

我假定人的定義是這樣的:

class Person extends Dao<Person> { 
} 
+0

就是這樣。謝謝! – Trace