List

Ho una domanda Java sui farmaci generici. Ho dichiarato un elenco generico:

List listOfMyType; 

Quindi in qualche metodo provo a istanziare e aggiungere elementi a quella lista:

 listOfMyType = new ArrayList(); listOfMyType.add(myTypeInstance); 

Dove myTypeInstance è solo un object di tipo MyType ; non verrà compilato. Dice:

Il metodo add (cattura # 3 di? Estende MyType) nel tipo List non è applicabile per gli argomenti (MyType)

Qualche idea?

Non puoi fare un “put” con estensioni. Guarda Generics: regola Get and Put .

Prendere in considerazione:

 class MySubType extends MyType { } List subtypeList = new ArrayList(); List list = subtypeList; list.add(new MyType()); MySubType sub = subtypeList.get(0); 

sub ora contiene un MyType che è molto sbagliato.

Non dovresti aver bisogno di usare la syntax di cattura dei caratteri jolly nel tuo caso, semplicemente dichiarando

 List listOfMytype; 

dovrebbe essere abbastanza Se vuoi sapere esattamente perché, il tutorial di Java Generics ha più di quello che vorresti sapere sulla follia esoterica di Java Generics. Page 20 affronta il tuo caso specifico.

Per quanto riguarda il motivo per cui aggiungere con la cattura jolly non funziona, è perché il compilatore non può determinare esattamente quale sottoclass di MyType l’elenco sarà in ogni caso, quindi il compilatore emette un errore.

C’è un thread simile qui: come possono essere aggiunti elementi a una raccolta generica con caratteri jolly?

Per avere un’idea di come funzionano i generici, dai un’occhiata a questo esempio:

  List sfoo = new ArrayList(); List foo; List tmp; tmp = sfoo; foo = (List) tmp; 

Il fatto è che non è stato progettato per le variabili locali / membri, ma per le firme delle funzioni, ecco perché è così arretrato.

Non so se questo ti aiuterà veramente, ma è qualcosa che ho dovuto usare chiamando un metodo generico di Spring Framework e volendo restituire anche un elenco generico:

 public  List findAll(String tableName,Class table) { String sql = "SELECT * FROM "+ tableName ; List entities = getSimpleJdbcTemplate().query(sql, ParameterizedBeanPropertyRowMapper.newInstance(table)); return (List) entities; } 

Sembra che la parametrizzazione richieda l’uso di? accedere all’elenco per ricevere i risultati e quindi eseguire il cast dell’elenco sul tipo di reso previsto.

Iam ancora abbagliato dai farmaci generici …