Download - Java SCJP clase7

Transcript
  • 8/18/2019 Java SCJP clase7

    1/29

    SCJP 6Clase 7 – Generics

    Ezequiel Aranda

    Sun Microsystems Campus

    Ambassador

  • 8/18/2019 Java SCJP clase7

    2/29

    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 inthe 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 CommonsAttribution – Noncommercial – Share Alike 3.0

    > http://creativecommons.org/licenses/by-nc-sa/3.0/

  • 8/18/2019 Java SCJP clase7

    3/29

     AGENDA

    > Generics

    > Métodos con generics

    > Declaraciones con generics

  • 8/18/2019 Java SCJP clase7

    4/29

  • 8/18/2019 Java SCJP clase7

    5/29

    La manera nueva: Generics

    List myList = new

     ArrayList();

     myList.add("Fred");

     myList.add(new Dog()); // error

    > Estamos diciéndole al compilador que esta

    colección solo puede contener Strings.

    String s = myList.get(0);

  • 8/18/2019 Java SCJP clase7

    6/29

    La manera nueva: Generics (II)

    > El tipo de los retornos puede ser declarado

    como un generic también:

     public Set getDogList() {

    Set dogs = newHashSet();

    // más código para insertar perros

    return dogs;}

  • 8/18/2019 Java SCJP clase7

    7/29

  • 8/18/2019 Java SCJP clase7

    8/29

    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;

    }

    }

  • 8/18/2019 Java SCJP clase7

    9/29

    List myList = new

     ArrayList();

     myList.add(4);

     myList.add(6);

    Inserter in = new Inserter();

    in.insert(myList);

    class Inserter {

    void insert(List list) {

    list.add(new String("42"));

    }

    }

  • 8/18/2019 Java SCJP clase7

    10/29

    Mezclando generics con non- 

    generics> Y todo eso, ¿Funciona?> Lamentablemente, si (compila y corre).

    > De hecho, el compilador nos advertirá (a

    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.

    > Sin embargo, un warning no es más que una

    advertencia. Es decir, no se lo considera un

    error.

  • 8/18/2019 Java SCJP clase7

    11/29

    Polimorfismo y generics

    > Pudimos asignar un ArrayList a una referencia

    a List porque List es un supertipo de ArrayList.

    List myList = new

     ArrayList();

    > Pero, ¿Podemos hacer esto?

    class Parent { }

    class Child extends Parent { }List myList = new

     ArrayList();

  • 8/18/2019 Java SCJP clase7

    12/29

  • 8/18/2019 Java SCJP clase7

    13/29

    Métodos con Generics public static void checkAnimals

    (ArrayList animals) {

    for(Animal a : animals) {

    a.checkup();}}

     public static void main(String[] args) {

    List dogs = new ArrayList();

    List cats = new ArrayList();

    List birds = new ArrayList();

    checkAnimals(dogs); // List

    checkAnimals(cats); // List

    checkAnimals(birds); // List

    }

  • 8/18/2019 Java SCJP clase7

    14/29

  • 8/18/2019 Java SCJP clase7

    15/29

    Métodos con Generics (III)

     public void addAnimal

    (ArrayList animals) {

    animals.add(new Dog());

    //a veces, vale...

    }

    > Podríamos, sin embargo, hacer algo como lo

    que se ve arriba, lo cual compilará siempre ycuando lo que pasemos al método sea un

    ArrayList.

  • 8/18/2019 Java SCJP clase7

    16/29

    Métodos con Generics (IV)

    > Hay un mecanismo para “decirle” al

    compilador que podemos aceptar cualquier

    subtipo del argumento declarado en la

    parametrización, porque no vamos a agregarnada en la colección.

    > Dicho mecanismo se llama “Wildcard”.

     public void addAnimal(List

  • 8/18/2019 Java SCJP clase7

    17/29

    Métodos con Generics (V)

    > Con

  • 8/18/2019 Java SCJP clase7

    18/29

    Métodos con Generics (VI)

     public static void addAnimal(List

  • 8/18/2019 Java SCJP clase7

    19/29

    Métodos con Generics (VII)

     public static void addAnimal(List

  • 8/18/2019 Java SCJP clase7

    20/29

    Pregunta

    >  public void foo(List list) { }

    >  public void foo(List list)

    { }

    ¿En que se diferencian?

  • 8/18/2019 Java SCJP clase7

    21/29

  • 8/18/2019 Java SCJP clase7

    22/29

    Métodos con Generics (IX)

     public void foo(List list)

    {}

    > Significa que el método solo puede tomar una

    List, no una lista parametrizada enalgún subtipo de Object.

    > Sin embargo, podremos agregar cosas a la

    colección.

  • 8/18/2019 Java SCJP clase7

    23/29

    Pregunta

    1) 

    List list = new ArrayList();

    2)  List

  • 8/18/2019 Java SCJP clase7

    24/29

    Declaraciones con Generics

     public class Bucket{ boolean

    add(E o) }

    > “” es una marcador de

    sustitución para el tipo queutilicemos. La interfaz List

    funciona en este caso como

    un template que, cuando

    escribamos nuestro código,

    cambiaremos por el tipo

    deseado.

  • 8/18/2019 Java SCJP clase7

    25/29

    Declaraciones con Generics (II)

    En otras palabras, el tipo que utilicemos parareemplazar ‘E’ cuando declaremos nuestras

    instancias será lo que podamos agregar a las

    colecciones involucradas.

    Bucket list = newBucket();

    > La ‘E’ pasa a ser un marcador de “coloque el

    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)

  • 8/18/2019 Java SCJP clase7

    26/29

    import java.util.*;

     public class RentalGeneric {

     private List rentalPool;

     private int maxNum; public RentalGeneric( int maxNum, List

    rentalPool) {

    this.maxNum = maxNum;

    this.rentalPool = rentalPool;

    }

     public T getRental() {

    return rentalPool.get(0);

    }

     public void returnRental(T returnedThing) {

    rentalPool.add(returnedThing);

    }

    }

  • 8/18/2019 Java SCJP clase7

    27/29

     public class AnimalHolder{

    T animal;

     public static void main(String[]

    args) {

     AnimalHolder dogHolder =

    new AnimalHolder(); // OK

     AnimalHolder x = new

     AnimalHolder(); // KO

    }}

  • 8/18/2019 Java SCJP clase7

    28/29

    Creando Métodos parametrizados

    import java.util.*;

     public class CreateAnArrayList {

     public void makeArrayList(T t) {

    /* Tomamos un objeto de un tipodesconocido y usamos ‘T’ para representar

    dicho tipo.*/

    List list = new ArrayList();

    // Ahora podemos crear la lista usando ‘T’ 

    list.add(t);

    }

    }

  • 8/18/2019 Java SCJP clase7

    29/29

    Preguntas


Top Related