2017-02-01 4 views
0

Мне нужно что-то вроде динамического типа возврата из моей функции. Мой код в этот момент, как:Динамические типы возврата через java generics

@Repository 
public class SswltDataDAO { 

    private static final Logger logger = LoggerFactory.getLogger(SswltDataDAO.class); 
    private JdbcTemplate jdbcTemplate; 

    @Autowired 
    @Qualifier("dataSource_sswlt") 
    public void setDataSource(DataSource dataSource) { 
     this.jdbcTemplate = new JdbcTemplate(dataSource); 
    } 

    public List<Object> getSswltData(String tableName, String sql, Class className) { 
     List<Object> listOfOblects = null; 
     try{ 
      listOfOblects = jdbcTemplate.query(sql, new BeanPropertyRowMapper(className)); 
     }catch(Exception e){ 
      logger.error("\n\nException while importing data from "+tableName+":\n", e); 
      listOfOblects = null; 
      e.printStackTrace(); 
     } 

     return listOfOblects; 
    } 

} 

И это использование метода: dataImportFromSswltToIwproImp()

Class MainService { 
    public boolean dataImportFromSswltToIwproImp() { 
     ....... 

     List<Object> list = sswltDataDAO.getSswltData("tbl_sswltdata_addresses", "select * from tbl_sswltdata_addresses", SswltdataAddresses.class); 

     .........; 
    } 
} 

Использование Дженерики Я хочу написать метод getSswltData() таким образом, что, а не возвращаемый List<Object>, он должен динамически возвращать List<class name>, т. е. список объектов типа класса, а не объектов класса объектов. Обратите внимание, что «Имя класса» - это класс, который передается во время вызова getSswltData(), и это будет динамическая часть кода.

Мне любопытно, что это все еще возможно или нет? Я достаточно гибкий, чтобы изменить любую часть моего кода, поэтому все предложения приветствуются.

ответ

2

Что касается подписи, что это возможно:

<T> List<T> getSswltData(String tableName, String sql, Class<T> className) 

Таким образом, можно определить возвращаемое значение будет список экземпляра класса, переданному в качестве параметра.

Внутренне вам, возможно, придется делать несколько приемов/преобразований, так как я предполагаю, что jdbcTemplate.query(sql, new BeanPropertyRowMapper(className)); просто возвращает List<Object>. Если вы очень уверены, что вы на самом деле получаете List<T>, вы можете попробовать бросить на необработанный тип List и от этого до List<T>, но вам нужно знать, что вы можете ввести трудноопределенные ошибки, если возвращаемый элемент не надет, t соответствует пройденному классу.

+0

Спасибо. просто интересно, как сделать в этой строке: listOfObjects = jdbcTemplate.query (sql, новый BeanPropertyRowMapper (className)); какие изменения мне нужно разместить в этой строке? – Shashank

+0

В основном 'listOfObjects = (List) ...' - но, пожалуйста, прочитайте предупреждение, которое я представил в последнем предложении. – Thomas

Смежные вопросы