2017-02-01 3 views
0

Ich brauche etwas wie dynamische Rückgabetyp von meiner Funktion. Mein Code ist in diesem Moment wie:Dynamische Rückgabetypen durch 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; 
    } 

} 

Und die Verwendung von Methode ist: dataImportFromSswltToIwproImp()

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

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

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

Mit Generics I Methode getSswltData() in einer solchen Art und Weise schreiben möchten, dass eher dann List<Object> zurückgeben sollte es List<class name> dh Liste der Objekte des Klassentyps, nicht der Objektklassenobjekte dynamisch zurückgeben. Bitte beachten Sie, dass "Klassenname" die Klasse ist, die beim Aufruf von getSwltData() übergeben wird. Dies ist der dynamische Teil des Codes.

Ich bin gespannt, ob es noch möglich ist oder nicht? Ich bin flexibel genug, um jeden Teil meines Codes zu ändern, so dass alle Vorschläge willkommen sind.

Antwort

2

Wie für die Signatur, die möglich ist:

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

diese Weise können Sie den Rückgabewert definieren eine Liste der Instanz der Klasse sein, das Sie als Parameter übergeben.

Intern müssen Sie möglicherweise einige Umwandlungen/Konvertierungen tun, da ich denke, dass jdbcTemplate.query(sql, new BeanPropertyRowMapper(className)); nur eine List<Object> zurückgibt. Wenn Sie sehr sicher, dass Sie tatsächlich ein List<T> bekommen Sie könnten versuchen, auf das rohe Art List zu werfen und sich von dem zu List<T> aber Sie müssen sich bewusst sein, dass Sie schwer vorstellen könnten Fehler zu erkennen, wenn das zurückgegebene Element don‘ t passen Sie die bestandene Klasse an.

+0

Danke. frage mich nur, wie man selbst in diese Zeile einwirft: listOfObjects = jdbcTemplate.query (sql, new BeanPropertyRowMapper (className)); Welche Änderungen muss ich in diese Zeile einfügen? – Shashank

+0

Grundsätzlich 'listOfObjects = (List) ...' - aber bitte lesen Sie die Warnung, die ich im letzten Satz gegeben habe. – Thomas