SlideShare ist ein Scribd-Unternehmen logo
1 von 29
Downloaden Sie, um offline zu lesen
SCJP 6
     Clase 7 – Generics




    Ezequiel Aranda
Sun Microsystems Campus
      Ambassador
Disclaimer & Acknowledgments
> Even though Ezequiel Aranda is a full-time employee of Sun
  Microsystems, the contents here are created as his own
  personal endeavor and thus does not reflect any official
  stance of Sun Microsystems.
> Sun Microsystems is not responsible for any inaccuracies in
  the contents.
> Acknowledgments – The slides of this presentation are made
  from “SCJP Unit 7” by Warit Wanwithu and Thanisa
  Kruawaisayawan and SCJP Workshop by P. Srikanth.
> This slides are Licensed under a Creative Commons
  Attribution – Noncommercial – Share Alike 3.0
   > http://creativecommons.org/licenses/by-nc-sa/3.0/
AGENDA

>  enerics
 G
>  étodos con generics
 M
>  eclaraciones con generics
 D
Generics

>  a manera antigua:
 L
  List myList = new ArrayList();
  myList.add(quot;Fredquot;);
  myList.add(new Dog());
  myList.add(new Integer(42));
>  os métodos que obtenian los objetos de las
 L
 colecciones sólo podían tener un único tipo
 de retorno: java.lang.Object
   String s = (String) myList.get(0);
La manera nueva: Generics

  List<String> myList = new
   ArrayList<String>();
  myList.add(quot;Fredquot;);
  myList.add(new Dog()); // error
>  stamos diciéndole al compilador que esta
 E
 colección solo puede contener Strings.
  String s = myList.get(0);
La manera nueva: Generics (II)

>  l tipo de los retornos puede ser declarado
 E
 como un generic también:
  public Set<Dog> getDogList() {
      Set<Dog> dogs = new
      HashSet<Dog>();
      // más código para insertar perros
      return dogs;
  }
Mezclando generics con non-
           generics
List<Integer> myList = new
 ArrayList<Integer>();
myList.add(4);
myList.add(6);
Adder adder = new Adder();
int total = adder.addAll(myList);
System.out.println(total);
class Adder {
    int addAll(List list) {
        Iterator it = list.iterator();
        int total = 0;
     while (it.hasNext()) {
          int i =
        ((Integer)it.next()).intValue();
         total += i;
     }
     return total;
    }
}
List<Integer> myList = new
  ArrayList<Integer>();
myList.add(4);
myList.add(6);
Inserter in = new Inserter();
in.insert(myList);
class Inserter {
    void insert(List list) {
        list.add(new String(quot;42quot;));
    }
}
Mezclando generics con non-
             generics
>  todo eso, ¿Funciona?
 Y
>  amentablemente, si (compila y corre).
 L
>  e hecho, el compilador nos advertirá (a
 D
 través de un warning) de que estamos
 corriendo un riesgo importante al enviar
 nuestra lista genérica a un método que no lo
 es.
>  in embargo, un warning no es más que una
 S
 advertencia. Es decir, no se lo considera un
 error.
Polimorfismo y generics

>  udimos asignar un ArrayList a una referencia
 P
 a List porque List es un supertipo de ArrayList.
  List<Integer> myList = new
   ArrayList<Integer>();
>  ero, ¿Podemos hacer esto?
 P
  class Parent { }
  class Child extends Parent { }
  List<Parent> myList = new
   ArrayList<Child>();
Polimorfismo y Generics (II)

>  n la declaración la regla es muy simple, el
 E
 tipo declarado en lado izquierdo debe ser el
 mismo que el tipo en el lado derecho.
  List<JButton> myList = new
   ArrayList<JButton>();
  List<Object> myList = new
   ArrayList<Object>();
  List<Integer> myList =
   newArrayList<Integer>();
Métodos con Generics
public static void checkAnimals
  (ArrayList<Animal> animals) {
    for(Animal a : animals) {
     a.checkup();}}
public static void main(String[] args) {
    List<Dog> dogs = new ArrayList<Dog>();
    List<Cat> cats = new ArrayList<Cat>();
    List<Bird> birds = new ArrayList<Bird>();
    checkAnimals(dogs); // List<Dog>
    checkAnimals(cats); // List<Cat>
    checkAnimals(birds); // List<Bird>
}
Métodos con Generics (II)

>  o pueden asignarse ArrayLists de subtipos
 N
 de Animal al ArrayList del supertipo Animal.
>  l compilador detendrá la compilación.
 E
>  a única cosa que puede pasarse como
 L
 parámetro en un método cuyo argumento sea
 un ArrayList<Animal> será un
 ArrayList<Animal>
Métodos con Generics (III)

  public void addAnimal
   (ArrayList<Animal> animals) {
      animals.add(new Dog());
      //a veces, vale...
  }
>  odríamos, sin embargo, hacer algo como lo
 P
 que se ve arriba, lo cual compilará siempre y
 cuando lo que pasemos al método sea un
 ArrayList<Animal>.
Métodos con Generics (IV)

>  ay un mecanismo para “decirle” al
 H
 compilador que podemos aceptar cualquier
 subtipo del argumento declarado en la
 parametrización, porque no vamos a agregar
 nada en la colección.
>  icho mecanismo se llama “Wildcard”.
 D
  public void addAnimal(List<?
   extends Animal> animals)
Métodos con Generics (V)

>  on <? extends Animal> estamos diciendo
 C
 “aquí podemos asignar una colección que sea
 un subtipo de List y/o este parametrizada con
 un subtipo de Animal…”
>  … Y prometemos no agregar nada a la
 “
 colección dentro de este método”.
  public void addAnimal(List<?
   extends Animal> animals) {
    animals.add(new Dog());
  // ¡NO! no podemos agregar nada
Métodos con Generics (VI)
> Hay una forma de usar un wildcard y
  que nos sea permitido agregar
  elementos a la colección: la palabra
  “super”.
  public static void addAnimal(List<? super
    Dog> animals)
> Esencialmente, estamos diciendo “Don compilador,
  acepte cualquier lista parametrizada con Dog o un
  supertipo de Dog. Cualquier cosa más abajo en el
  árbol de herencia, no; pero cualquier cosa más
  arriba, sí”.
Métodos con Generics (VII)
public static void addAnimal(List<? super
  Dog> animals) {
animals.add(new Dog());
}
public static void main(String[] args) {
List<Animal> animals = new
  ArrayList<Animal>();
animals.add(new Dog());
addAnimal(animals);
}
Pregunta

> public void foo(List<?> list) { }
> public void foo(List<Object> list)
  { }
>  En que se diferencian?
 ¿
Métodos con Generics (VIII)

  public void foo(List<?> list) { }
>  implemente significa “cualquier tipo”.
 S
>  ualquier List podría asignarse al argumento.
 C
>  in usar “super”, no podremos agregar nada
 S
 a list.
Métodos con Generics (IX)

  public void foo(List<Object> list)
   {}
>  ignifica que el método solo puede tomar una
 S
 List<Object>, no una lista parametrizada en
 algún subtipo de Object.
>  in embargo, podremos agregar cosas a la
 S
 colección.
Pregunta
1)  List<?> list = new ArrayList<Dog>();
2)  List<? extends Animal> aList = new
    ArrayList<Dog>();
3)  List<?> foo = new ArrayList<? extends
    Animal>();
4)  List<? extends Dog> cList = new
    ArrayList<Integer>();
5)  List<? super Dog> bList = new
    ArrayList<Animal>();
6)  List<? super Animal> dList = new
    ArrayList<Dog>();

>  ¿Cuales compilan?
Declaraciones con Generics

  public class Bucket<E>{ boolean
   add(E o) }

>  <E>” es una marcador de
 “
 sustitución para el tipo que
 utilicemos. La interfaz List
 funciona en este caso como
 un template que, cuando
 escribamos nuestro código,
 cambiaremos por el tipo
 deseado.
Declaraciones con Generics (II)
>  n otras palabras, el tipo que utilicemos para
 E
 reemplazar ‘E’ cuando declaremos nuestras
 instancias será lo que podamos agregar a las
 colecciones involucradas.
  Bucket<Animal> list = new
   Bucket<Animal>();
>  a ‘E’ pasa a ser un marcador de “coloque el
 L
 tipo deseado aquí” a ser específicamente el
 tipo “Animal”, y el método add a comportarse
 de la siguiente forma:
  boolean add(Animal a)
import java.util.*;
public class RentalGeneric<T> {
    private List<T> rentalPool;
    private int maxNum;
    public RentalGeneric( int maxNum, List<T>
    rentalPool) {
        this.maxNum = maxNum;
        this.rentalPool = rentalPool;
    }
    public T getRental() {
     return rentalPool.get(0);
    }
    public void returnRental(T returnedThing) {
        rentalPool.add(returnedThing);
    }
}
public class AnimalHolder<T extends
  Animal>{
    T animal;
    public static void main(String[]
    args) {
     AnimalHolder<Dog> dogHolder =
    new AnimalHolder<Dog>(); // OK
     AnimalHolder<Integer> x = new
    AnimalHolder<Integer>(); // KO
    }
}
Creando Métodos parametrizados
import java.util.*;
public class CreateAnArrayList {
    public <T> void makeArrayList(T t) {
        /* Tomamos un objeto de un tipo
        desconocido y usamos ‘T’ para representar
        dicho tipo.*/
     List<T> list = new ArrayList<T>();
        // Ahora podemos crear la lista usando ‘T’
        list.add(t);
    }
}
Preguntas

Weitere ähnliche Inhalte

Was ist angesagt?

Programa Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosPrograma Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosjubacalo
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql ServerCorfapo
 
Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4Robert Wolf
 
Java::Acceso a Bases de Datos
Java::Acceso a Bases de DatosJava::Acceso a Bases de Datos
Java::Acceso a Bases de Datosjubacalo
 
Jyoc java-cap03 bucles
Jyoc java-cap03 buclesJyoc java-cap03 bucles
Jyoc java-cap03 buclesJyoc X
 
Jyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc X
 
Servlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLServlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLjubacalo
 
SCJP, Clase 2: Ejemplos De Enum, Poo
SCJP, Clase 2: Ejemplos De Enum, PooSCJP, Clase 2: Ejemplos De Enum, Poo
SCJP, Clase 2: Ejemplos De Enum, Pooflekoso
 

Was ist angesagt? (19)

Programa Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosPrograma Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viveros
 
Clase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScriptClase 7 objetos globales de javaScript
Clase 7 objetos globales de javaScript
 
Clase 5 funciones en javaScript
Clase 5 funciones en javaScriptClase 5 funciones en javaScript
Clase 5 funciones en javaScript
 
7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server7090112 Clase Transact Sql Server
7090112 Clase Transact Sql Server
 
Clase 6 objetos de javaScript
Clase 6 objetos de javaScriptClase 6 objetos de javaScript
Clase 6 objetos de javaScript
 
Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4Manuales seminario java-manualdejava-sem 3 - 4
Manuales seminario java-manualdejava-sem 3 - 4
 
Java::Acceso a Bases de Datos
Java::Acceso a Bases de DatosJava::Acceso a Bases de Datos
Java::Acceso a Bases de Datos
 
Semana 1 Estructuras de Datos en Java
Semana 1   Estructuras de Datos en JavaSemana 1   Estructuras de Datos en Java
Semana 1 Estructuras de Datos en Java
 
Jyoc java-cap03 bucles
Jyoc java-cap03 buclesJyoc java-cap03 bucles
Jyoc java-cap03 bucles
 
Jyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcacionesJyoc java-cap02 bifurcaciones
Jyoc java-cap02 bifurcaciones
 
Semana 1 Estructuras de Control en Java
Semana 1   Estructuras de Control en JavaSemana 1   Estructuras de Control en Java
Semana 1 Estructuras de Control en Java
 
Servlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLServlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTML
 
Clase 21 programacion ejb 3.0
Clase 21 programacion ejb 3.0Clase 21 programacion ejb 3.0
Clase 21 programacion ejb 3.0
 
Semana 4 Introduccion Javascript
Semana 4   Introduccion JavascriptSemana 4   Introduccion Javascript
Semana 4 Introduccion Javascript
 
Por pagar
Por pagarPor pagar
Por pagar
 
Guia 12 js
Guia 12 jsGuia 12 js
Guia 12 js
 
Ajax
AjaxAjax
Ajax
 
Programación Java
Programación JavaProgramación Java
Programación Java
 
SCJP, Clase 2: Ejemplos De Enum, Poo
SCJP, Clase 2: Ejemplos De Enum, PooSCJP, Clase 2: Ejemplos De Enum, Poo
SCJP, Clase 2: Ejemplos De Enum, Poo
 

Andere mochten auch

Cultura Libre: Origenes, Definiciones y Alcances
Cultura Libre: Origenes, Definiciones y AlcancesCultura Libre: Origenes, Definiciones y Alcances
Cultura Libre: Origenes, Definiciones y Alcancesflekoso
 
De 0 A Python En 40 Minutos
De 0 A Python En 40 MinutosDe 0 A Python En 40 Minutos
De 0 A Python En 40 Minutosflekoso
 
SCJP, Clase 9: Threads
SCJP, Clase 9: ThreadsSCJP, Clase 9: Threads
SCJP, Clase 9: Threadsflekoso
 
Introducción a JavaFX
Introducción a JavaFXIntroducción a JavaFX
Introducción a JavaFXflekoso
 
Ruby: a Programmer's best friend
Ruby: a Programmer's best friendRuby: a Programmer's best friend
Ruby: a Programmer's best friendflekoso
 
SCJP, Clase 10: Strings, I/O
SCJP, Clase 10: Strings, I/OSCJP, Clase 10: Strings, I/O
SCJP, Clase 10: Strings, I/Oflekoso
 
JavaFX 1.2 - Introducción
JavaFX 1.2 - IntroducciónJavaFX 1.2 - Introducción
JavaFX 1.2 - Introducciónflekoso
 
Índice Libro "macOS Hacking" de 0xWord
Índice Libro "macOS Hacking" de 0xWordÍndice Libro "macOS Hacking" de 0xWord
Índice Libro "macOS Hacking" de 0xWordTelefónica
 
Introducción a la Programación con Java
Introducción a la Programación con JavaIntroducción a la Programación con Java
Introducción a la Programación con Javaflekoso
 

Andere mochten auch (9)

Cultura Libre: Origenes, Definiciones y Alcances
Cultura Libre: Origenes, Definiciones y AlcancesCultura Libre: Origenes, Definiciones y Alcances
Cultura Libre: Origenes, Definiciones y Alcances
 
De 0 A Python En 40 Minutos
De 0 A Python En 40 MinutosDe 0 A Python En 40 Minutos
De 0 A Python En 40 Minutos
 
SCJP, Clase 9: Threads
SCJP, Clase 9: ThreadsSCJP, Clase 9: Threads
SCJP, Clase 9: Threads
 
Introducción a JavaFX
Introducción a JavaFXIntroducción a JavaFX
Introducción a JavaFX
 
Ruby: a Programmer's best friend
Ruby: a Programmer's best friendRuby: a Programmer's best friend
Ruby: a Programmer's best friend
 
SCJP, Clase 10: Strings, I/O
SCJP, Clase 10: Strings, I/OSCJP, Clase 10: Strings, I/O
SCJP, Clase 10: Strings, I/O
 
JavaFX 1.2 - Introducción
JavaFX 1.2 - IntroducciónJavaFX 1.2 - Introducción
JavaFX 1.2 - Introducción
 
Índice Libro "macOS Hacking" de 0xWord
Índice Libro "macOS Hacking" de 0xWordÍndice Libro "macOS Hacking" de 0xWord
Índice Libro "macOS Hacking" de 0xWord
 
Introducción a la Programación con Java
Introducción a la Programación con JavaIntroducción a la Programación con Java
Introducción a la Programación con Java
 

Ähnlich wie SCJP, Clase 7: Generics

Clase7 generics
Clase7 genericsClase7 generics
Clase7 genericsjorg_marq
 
Android Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG UruguayAndroid Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG Uruguaygtuguruguay
 
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDD
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDDREPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDD
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDDSandra Campos
 
Asegúr@IT II - Seguridad en Web
Asegúr@IT II - Seguridad en WebAsegúr@IT II - Seguridad en Web
Asegúr@IT II - Seguridad en WebChema Alonso
 
Introducción a Python
Introducción a PythonIntroducción a Python
Introducción a Pythonnqnwebs
 
Trabajo final programacion
Trabajo final programacionTrabajo final programacion
Trabajo final programacionmarkos1992
 
Sesion Nº 08 - Libreria Online En Php & Introduccion A Mysql
Sesion Nº 08 - Libreria Online En Php & Introduccion A MysqlSesion Nº 08 - Libreria Online En Php & Introduccion A Mysql
Sesion Nº 08 - Libreria Online En Php & Introduccion A MysqlEdgar A. Cruz Huaman
 
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)Videoconferencias UTPL
 
ED 02 2_tda_arra_u
ED 02 2_tda_arra_uED 02 2_tda_arra_u
ED 02 2_tda_arra_uA J
 
Introduccion a Python por Facundo Batista
Introduccion a Python por Facundo BatistaIntroduccion a Python por Facundo Batista
Introduccion a Python por Facundo BatistaRoberto Allende
 
Videoconferencia
VideoconferenciaVideoconferencia
Videoconferenciaalberto
 
Curso programacionpython Clase 1
Curso programacionpython Clase 1Curso programacionpython Clase 1
Curso programacionpython Clase 1sindyvaness
 
Curso TIC de PHP y MSQL Parte 2
Curso TIC de PHP y MSQL Parte 2Curso TIC de PHP y MSQL Parte 2
Curso TIC de PHP y MSQL Parte 2Wilian
 

Ähnlich wie SCJP, Clase 7: Generics (20)

Clase7 generics
Clase7 genericsClase7 generics
Clase7 generics
 
Android Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG UruguayAndroid Bootcamp - GTUG Uruguay
Android Bootcamp - GTUG Uruguay
 
Xml On Rails
Xml On RailsXml On Rails
Xml On Rails
 
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDD
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDDREPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDD
REPORTES JASPERREPORT E IREPORT SIN CONEXIÓN A UNA BBDD
 
Asegúr@IT II - Seguridad en Web
Asegúr@IT II - Seguridad en WebAsegúr@IT II - Seguridad en Web
Asegúr@IT II - Seguridad en Web
 
PHP
PHPPHP
PHP
 
Introducción a Python
Introducción a PythonIntroducción a Python
Introducción a Python
 
Introducción a Python
Introducción a PythonIntroducción a Python
Introducción a Python
 
Trabajo final programacion
Trabajo final programacionTrabajo final programacion
Trabajo final programacion
 
Sesion Nº 08 - Libreria Online En Php & Introduccion A Mysql
Sesion Nº 08 - Libreria Online En Php & Introduccion A MysqlSesion Nº 08 - Libreria Online En Php & Introduccion A Mysql
Sesion Nº 08 - Libreria Online En Php & Introduccion A Mysql
 
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
UTPL-PROGRAMACIÓN AVANZADA-II-BIMESTRE-(OCTUBRE 2011-FEBRERO 2012)
 
ED 02 2_tda_arra_u
ED 02 2_tda_arra_uED 02 2_tda_arra_u
ED 02 2_tda_arra_u
 
Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
 
C# calculadora
C# calculadoraC# calculadora
C# calculadora
 
Introduccion a Python por Facundo Batista
Introduccion a Python por Facundo BatistaIntroduccion a Python por Facundo Batista
Introduccion a Python por Facundo Batista
 
Best Practices
Best PracticesBest Practices
Best Practices
 
Videoconferencia
VideoconferenciaVideoconferencia
Videoconferencia
 
Clase09 java script
Clase09 java scriptClase09 java script
Clase09 java script
 
Curso programacionpython Clase 1
Curso programacionpython Clase 1Curso programacionpython Clase 1
Curso programacionpython Clase 1
 
Curso TIC de PHP y MSQL Parte 2
Curso TIC de PHP y MSQL Parte 2Curso TIC de PHP y MSQL Parte 2
Curso TIC de PHP y MSQL Parte 2
 

Kürzlich hochgeladen

Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxRogerPrieto3
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 

Kürzlich hochgeladen (15)

Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptx
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 

SCJP, Clase 7: Generics

  • 1. SCJP 6 Clase 7 – Generics Ezequiel Aranda Sun Microsystems Campus Ambassador
  • 2. Disclaimer & Acknowledgments > Even though Ezequiel Aranda is a full-time employee of Sun Microsystems, the contents here are created as his own personal endeavor and thus does not reflect any official stance of Sun Microsystems. > Sun Microsystems is not responsible for any inaccuracies in the contents. > Acknowledgments – The slides of this presentation are made from “SCJP Unit 7” by Warit Wanwithu and Thanisa Kruawaisayawan and SCJP Workshop by P. Srikanth. > This slides are Licensed under a Creative Commons Attribution – Noncommercial – Share Alike 3.0 > http://creativecommons.org/licenses/by-nc-sa/3.0/
  • 3. AGENDA >  enerics G >  étodos con generics M >  eclaraciones con generics D
  • 4. Generics >  a manera antigua: L List myList = new ArrayList(); myList.add(quot;Fredquot;); myList.add(new Dog()); myList.add(new Integer(42)); >  os métodos que obtenian los objetos de las L colecciones sólo podían tener un único tipo de retorno: java.lang.Object String s = (String) myList.get(0);
  • 5. La manera nueva: Generics List<String> myList = new ArrayList<String>(); myList.add(quot;Fredquot;); myList.add(new Dog()); // error >  stamos diciéndole al compilador que esta E colección solo puede contener Strings. String s = myList.get(0);
  • 6. La manera nueva: Generics (II) >  l tipo de los retornos puede ser declarado E como un generic también: public Set<Dog> getDogList() { Set<Dog> dogs = new HashSet<Dog>(); // más código para insertar perros return dogs; }
  • 7. Mezclando generics con non- generics List<Integer> myList = new ArrayList<Integer>(); myList.add(4); myList.add(6); Adder adder = new Adder(); int total = adder.addAll(myList); System.out.println(total);
  • 8. class Adder { int addAll(List list) { Iterator it = list.iterator(); int total = 0; while (it.hasNext()) { int i = ((Integer)it.next()).intValue(); total += i; } return total; } }
  • 9. List<Integer> myList = new ArrayList<Integer>(); myList.add(4); myList.add(6); Inserter in = new Inserter(); in.insert(myList); class Inserter { void insert(List list) { list.add(new String(quot;42quot;)); } }
  • 10. Mezclando generics con non- generics >  todo eso, ¿Funciona? Y >  amentablemente, si (compila y corre). L >  e hecho, el compilador nos advertirá (a D través de un warning) de que estamos corriendo un riesgo importante al enviar nuestra lista genérica a un método que no lo es. >  in embargo, un warning no es más que una S advertencia. Es decir, no se lo considera un error.
  • 11. Polimorfismo y generics >  udimos asignar un ArrayList a una referencia P a List porque List es un supertipo de ArrayList. List<Integer> myList = new ArrayList<Integer>(); >  ero, ¿Podemos hacer esto? P class Parent { } class Child extends Parent { } List<Parent> myList = new ArrayList<Child>();
  • 12. Polimorfismo y Generics (II) >  n la declaración la regla es muy simple, el E tipo declarado en lado izquierdo debe ser el mismo que el tipo en el lado derecho. List<JButton> myList = new ArrayList<JButton>(); List<Object> myList = new ArrayList<Object>(); List<Integer> myList = newArrayList<Integer>();
  • 13. Métodos con Generics public static void checkAnimals (ArrayList<Animal> animals) { for(Animal a : animals) { a.checkup();}} public static void main(String[] args) { List<Dog> dogs = new ArrayList<Dog>(); List<Cat> cats = new ArrayList<Cat>(); List<Bird> birds = new ArrayList<Bird>(); checkAnimals(dogs); // List<Dog> checkAnimals(cats); // List<Cat> checkAnimals(birds); // List<Bird> }
  • 14. Métodos con Generics (II) >  o pueden asignarse ArrayLists de subtipos N de Animal al ArrayList del supertipo Animal. >  l compilador detendrá la compilación. E >  a única cosa que puede pasarse como L parámetro en un método cuyo argumento sea un ArrayList<Animal> será un ArrayList<Animal>
  • 15. Métodos con Generics (III) public void addAnimal (ArrayList<Animal> animals) { animals.add(new Dog()); //a veces, vale... } >  odríamos, sin embargo, hacer algo como lo P que se ve arriba, lo cual compilará siempre y cuando lo que pasemos al método sea un ArrayList<Animal>.
  • 16. Métodos con Generics (IV) >  ay un mecanismo para “decirle” al H compilador que podemos aceptar cualquier subtipo del argumento declarado en la parametrización, porque no vamos a agregar nada en la colección. >  icho mecanismo se llama “Wildcard”. D public void addAnimal(List<? extends Animal> animals)
  • 17. Métodos con Generics (V) >  on <? extends Animal> estamos diciendo C “aquí podemos asignar una colección que sea un subtipo de List y/o este parametrizada con un subtipo de Animal…” >  … Y prometemos no agregar nada a la “ colección dentro de este método”. public void addAnimal(List<? extends Animal> animals) { animals.add(new Dog()); // ¡NO! no podemos agregar nada
  • 18. Métodos con Generics (VI) > Hay una forma de usar un wildcard y que nos sea permitido agregar elementos a la colección: la palabra “super”. public static void addAnimal(List<? super Dog> animals) > Esencialmente, estamos diciendo “Don compilador, acepte cualquier lista parametrizada con Dog o un supertipo de Dog. Cualquier cosa más abajo en el árbol de herencia, no; pero cualquier cosa más arriba, sí”.
  • 19. Métodos con Generics (VII) public static void addAnimal(List<? super Dog> animals) { animals.add(new Dog()); } public static void main(String[] args) { List<Animal> animals = new ArrayList<Animal>(); animals.add(new Dog()); addAnimal(animals); }
  • 20. Pregunta > public void foo(List<?> list) { } > public void foo(List<Object> list) { } >  En que se diferencian? ¿
  • 21. Métodos con Generics (VIII) public void foo(List<?> list) { } >  implemente significa “cualquier tipo”. S >  ualquier List podría asignarse al argumento. C >  in usar “super”, no podremos agregar nada S a list.
  • 22. Métodos con Generics (IX) public void foo(List<Object> list) {} >  ignifica que el método solo puede tomar una S List<Object>, no una lista parametrizada en algún subtipo de Object. >  in embargo, podremos agregar cosas a la S colección.
  • 23. Pregunta 1)  List<?> list = new ArrayList<Dog>(); 2)  List<? extends Animal> aList = new ArrayList<Dog>(); 3)  List<?> foo = new ArrayList<? extends Animal>(); 4)  List<? extends Dog> cList = new ArrayList<Integer>(); 5)  List<? super Dog> bList = new ArrayList<Animal>(); 6)  List<? super Animal> dList = new ArrayList<Dog>(); >  ¿Cuales compilan?
  • 24. Declaraciones con Generics public class Bucket<E>{ boolean add(E o) } >  <E>” es una marcador de “ sustitución para el tipo que utilicemos. La interfaz List funciona en este caso como un template que, cuando escribamos nuestro código, cambiaremos por el tipo deseado.
  • 25. Declaraciones con Generics (II) >  n otras palabras, el tipo que utilicemos para E reemplazar ‘E’ cuando declaremos nuestras instancias será lo que podamos agregar a las colecciones involucradas. Bucket<Animal> list = new Bucket<Animal>(); >  a ‘E’ pasa a ser un marcador de “coloque el L tipo deseado aquí” a ser específicamente el tipo “Animal”, y el método add a comportarse de la siguiente forma: boolean add(Animal a)
  • 26. import java.util.*; public class RentalGeneric<T> { private List<T> rentalPool; private int maxNum; public RentalGeneric( int maxNum, List<T> rentalPool) { this.maxNum = maxNum; this.rentalPool = rentalPool; } public T getRental() { return rentalPool.get(0); } public void returnRental(T returnedThing) { rentalPool.add(returnedThing); } }
  • 27. public class AnimalHolder<T extends Animal>{ T animal; public static void main(String[] args) { AnimalHolder<Dog> dogHolder = new AnimalHolder<Dog>(); // OK AnimalHolder<Integer> x = new AnimalHolder<Integer>(); // KO } }
  • 28. Creando Métodos parametrizados import java.util.*; public class CreateAnArrayList { public <T> void makeArrayList(T t) { /* Tomamos un objeto de un tipo desconocido y usamos ‘T’ para representar dicho tipo.*/ List<T> list = new ArrayList<T>(); // Ahora podemos crear la lista usando ‘T’ list.add(t); } }