Polimorfismocom Genericos Porestarmos lidando sempre com objetos muitosprogramadores confundem a declaracaode umalista com genericosutilizando opolimorfismo. Uma vez que e possivel realizar adeclaracao comarrays e variaveis comuns, poque nao e possivel realizarutilizando genericos? Exemplo:Campeonatossurf= newSurf();//OKCampeonatosksurf= newKiteSurf();//OKCampeonatoswsurf= newWindSurf();//OKCampeonatoscamp= newCampeonatos();//OKCampeonatos[]campS= newSurf[4];//OKCampeonatos[]campKS= newKiteSurf[4];//OKSurf[]surf= { newSurf(), newSurf(), newSurf() };//OKKiteSurf[]kiteSurf= { newKiteSurf(), newKiteSurf(), newKiteSurf() };//OKWindSurf[]windSurfs= { newWindSurf() };//OKclassCampeonatos { publicvoidpreRequisistos() { System.out.print("necessarioprancha "); }}classSurf extendsCampeonatos { publicvoidpreRequisistos() { super.preRequisistos(); System.out.println("eondas!"); }}classKiteSurf extendsCampeonatos { publicvoidpreRequisistos() { super.preRequisistos(); System.out.println(",ventos e pipa!"); }}classWindSurf extendsCampeonatos { publicvoidpreRequisistos() { super.preRequisistos(); System.out.println(",ventos e vela!"); }} Vemosacima 4 classes a classe Campeonatos e a pai e asoutras tres (Surf,KiteSurf, WindSurf)sao o que dizemos de classes filhas. Noinicio do codigo acima vemos nas quatroprimeiras linhas declaracoes devariaveis de instancia de uma classe usando polimorfismo o que paranos e algo comum assim como ja vimos as outras quatro declaracoesde um array usando o polimorfismo, mas quando chegamos na hora dedeclarar um arrayList, nos deparamos com um erro que a principio naoesperavamos que fosse ocorrer. Ateporque o proprio arrayListse utilizado polimorfismo no momento em que sua delcaracao utiliza comoclasse de referencia a interface Liste a classe de instanciaa ArrayList. Porqueentao nao poderia utilizar genericos da mesma maneira? Explicareimais adiante o motivo, mas antes farei uma abordagemsobrearray quefizemosnocodigo acima e que esperavamos que funcionassecom conjuntos de tipo especificos. Vimoserros de compilacaoqueocorrem durante a declaracao de um conjunto com a utilizacao degenericos junto com polimorfismo, esteerro tambem podera ser visto napassagem de paramentro em metodos.Conforme mostraremos no codigo abaixo nao sera possivel apassagem de parametros de um conjunto ArrayList<Surf>a um metodo que possui como parametro ArrayList<Campeonatos>eeclaro que utilizamos as aspas acima pois istonao poderia ficar tao engessado,existemmaneiras de como ela pordera aceitarcomoparamentro uma lista de subclasses mas isso eu mostrarei maisadiante por hora demonstro esse codigo abaixo para terem uma ideiado que estou falando e em seguida darei mais detalhes.//List<Campeonatos> campeonatos1 = new ArrayList<Surf>();//ERRO Compilacao//List<Campeonatos> campeonatos = new ArrayList<WindSurf>();//ERRO Compilacao//List<Campeonatos> campeonatos2 = new ArrayList<KiteSurf>();//ERRO CompilacaoList<Surf>campeonatos3= newArrayList<Surf>();//OK List<KiteSurf>campeonatos4= newArrayList<KiteSurf>();//OKList<WindSurf>campeonatos5= newArrayList<WindSurf>();//OKList<Campeonatos>campeonatos6= newArrayList<Campeonatos>();//OKCampeonatos[]campS= newSurf[4];Campeonatos[]campKS= newKiteSurf[4];Surf[]surf= { newSurf(), newSurf(), newSurf() };KiteSurf[]kiteSurf= { newKiteSurf(), newKiteSurf(), newKiteSurf() };WindSurf[]windSurfs= { newWindSurf() };Eventoseventos= newEventos();eventos.comecarCampeonatos(campeonatos3);//ERRO DE COMPILACAOeventos.comecarCampeonatos(campeonatos4);//ERRO DE COMPILACAOeventos.comecarCampeonatos(campeonatos5);//ERRO DE COMPILACAOeventos.comecarCampeonatos(campeonatos6);//OKeventos.realizarEventos(surf);//OKeventos.realizarEventos(kiteSurf);//OKeventos.realizarEventos(windSurfs);//OKclassEventos { publicvoidcomecarCampeonatos(List<Campeonatos>campeonatos){ for(Campeonatosc:campeonatos){ c.preRequisistos(); } } publicvoidrealizarEventos(Campeonatos[] listaDeEventos){ System.out.println("array"); for(Campeonatos c: listaDeEventos){ c.preRequisistos(); } }} Conformefalado anteriormente, vemos que unica variavel campeonatos6aceita pelo compilador para passagem de paramentro do metodocomecarCampeonatos, issoporque ela e a unica que possui declaracao identica a doparametro do metodo. Oque mais intriga e o motivo que faz com que seja possivel fazeresta passagem por arrays e nao com arrayList e a razao e bemsimples, o compilador faz o tratamento entre arrays e ArrayListdiferentes apesar de terem certas familiaridades. Comecareifalando das suas familiaridades que sao mais simples para depoisvermos os tratamentos diferentes. Tantoarray quanto ArrrayList possuem beneficios de serem declararados porum supertipo mais abstrato como:O array podera armazenar objetos de varios tipos de subTipos do superTipoManipulacao do array assuminto que tudo dele pode responder a sua superClasse.Aproveitamento de codigo e facilitando na facil alteracao do codigo. Issofaz com que tanto Arrays quanto ArrayList possam armazenar seussubTipos conforme exemplo abaixo: ArrayList<Surf>surf2= newArrayList<Surf>(); surf2.add(newSurf()); surf2.add(newSurf()); surf2.add(newSurf()); ArrayList<KiteSurf>kiteSurf2= newArrayList<KiteSurf>(); kiteSurf2.add(newKiteSurf()); kiteSurf2.add(newKiteSurf()); kiteSurf2.add(newKiteSurf()); ArrayList<WindSurf>windSurfs2= newArrayList<WindSurf>(); windSurfs2.add(newWindSurf()); ArrayList<Campeonatos>camps= newArrayList<Campeonatos>(); camps.add(newSurf());