java scjp clase7
Embed Size (px)
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