Dai un'occhiata a queste tre classi. Minatchi si lascia estendere in modo che anche il tipo di ritorno dei suoi metodi possa essere esteso. Per illustrare, ho usato un metodo statico.Generics Java che estendono il tipo di metodi di restituzione
public class Minatchi<T extends Minatchi<?>>{
static public <T extends Minatchi<?>>
List<T> listAll(){
return
(List<T>) query();
}
}
E così mi sottoclasse Minatchi in Lady
public class Lady
extends Minatchi<Lady>{
}
Questo è dove il comportamento discutibile avviene.
public class HelloMinatchi{
private void listA(){
List<Lady> uvs = Lady.listAll();
for (Lady uv: uvs){
logger.info(uv.getName());
}
}
private void listB(){
for (Lady uv: Lady.listAll()){
logger.info(uv.getName());
}
}
}
L'elenco di metodi A e l'elencoB sono essenzialmente uguali. listA pone l'elenco in una variabile intermedia uvs, mentre listB inserisce direttamente l'elenco All nell'intestazione del ciclo.
Tuttavia, per listB, il compilatore si lamenta Impossibile convertire Minatchi <? A Lady.
Quindi questa domanda riguarda l'integrità di progettazione dei generici Java. Ancora un'altra lamentela generica.
Si tratta di una funzionalità di progettazione intenzionale o di un bug di progettazione non intenzionale che i progettisti di generici Java non sapevano come risolvere. Se intenzionale, perché lo hanno fatto? Se bug, stanno progettando di risolverlo?
O è questo il mio problema personale che non conosco un modo migliore per dichiarare i generici? Se è così, dimmi come.
(ho usato una classe Minatchi generica perché ho metodi non statici per essere esposti a estensione di classe troppo, che ho lasciato in questione.)
Ho usato una classe Minatchi generica perché ho anche metodi non statici da esporre all'estensione di classe, che ho tralasciato nel domanda. –