Listar

Eu tenho uma pergunta Java sobre genéricos. Eu declarei uma lista genérica:

List listOfMyType; 

Então, em algum método, tento instanciar e adicionar itens a essa lista:

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

Onde myTypeInstance é apenas um object do tipo MyType ; não compilará. Diz:

O método add (capture # 3-of? Estende MyType) no tipo List não é aplicável para os argumentos (MyType)

Qualquer ideia?

Você não pode fazer um “put” com extensões. Veja a regra Generics – Get and Put .

Considerar:

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

sub agora contém um MyType que está muito errado.

Você não deve precisar usar a syntax de captura curinga no seu caso, simplesmente declarando

 List listOfMytype; 

deve ser suficiente. Se você quiser saber exatamente por quê, o Java Generics Tutorial tem mais do que você gostaria de saber sobre a loucura esotérica do Java Generics. Página 20 aborda o seu caso específico.

Por que adicionar com a captura curinga não funciona, é porque o compilador não pode determinar exatamente qual subclass de MyType a lista será em todos os casos, portanto o compilador emite um erro.

Há um thread semelhante aqui: Como os elementos podem ser adicionados a uma coleção genérica de caractere curinga?

Para ter uma ideia de como os genéricos funcionam, confira este exemplo:

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

A coisa é que não foi projetado para variables ​​locais / membros, mas para assinaturas de function, é por isso que é tão burro para trás.

Eu não sei se isso realmente vai ajudar você, mas isso é algo que eu tive que usar ao chamar um método genérico de Spring Framework e querendo retornar também uma lista genérica:

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

Parece que a parametrização precisa de você para usar o? faça login na lista para receber os resultados e, em seguida, lance a lista para o tipo de retorno esperado.

Eu ainda estou ofuscado pelos genéricos …