2017-02-01 10 views
0

내 함수에서 동적 반환 유형과 같은 것이 필요합니다. 이 방법의 사용은자바 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> 즉 Object 클래스 객체가 아닌 클래스 유형 객체의 목록을 동적으로 반환해야합니다. "클래스 이름"은 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>으로 전송하려고 시도 할 수는 있지만 반환 된 요소가 ' 전달 된 클래스와 일치하지 않습니다.

+0

감사합니다. 이 줄 자체에서 어떻게 캐스팅하는지 궁금합니다. listOfObjects = jdbcTemplate.query (sql, new BeanPropertyRowMapper (className)); 이 줄에 어떤 변화가 필요합니까? – Shashank

+0

기본적으로'listOfObjects = (List) ...'-하지만 마지막 문장에서 제공 한 경고문을 읽으십시오. – Thomas