Sunteți pe pagina 1din 37

1

Mtodos y clases
genricos
Ma. de los Angeles Junco Rey

La superclase Object
La clase Object contiene varios mtodos y es la clase
universal.
No es una clase abstracta, por lo que define e
implementa cada uno de sus mtodos que pueden
usarse con polimorfismo para crear algoritmos
generalizados.
Por ello puede designarse cualquier objeto a una
referencia tipo Object, pero se requiere de realizar un
down-cast para regresar la referencia a su tipo original
cuando se acceden sus valores.
Esto puede generar un error de ejecucin tipo
ClassCastException si se equivoca de tipo.

Ma. de los Angeles Junco Rey

La superclase Object

Ma. de los Angeles Junco Rey

Clase Store para enteros

public class Store {


private int value;
public Store( int v ) { value = v; }

public int getValue( ) {


return value; }
public void setValue( int v ) {
value = v; }
public String toString( ) {
return value = + value; }

Esta clase sirve para


enteros, pero si
queremos otro tipo de
datos como double
hay que hacer otra
clase igual,
cambiando slo el tipo
de dato.
public class Store {
private double value;

}
Ma. de los Angeles Junco Rey

Solucin (?)
Crear una clase GENERAL que guarde elementos de
diferentes tipos. Puede utilizarse el tipo universal
Object.
A considerar:
Es necesario realizar un cast para acceder a cualquier
elemento de una coleccin

Pueden agregarse Objects de diferentes tipos y, por lo


tanto, puede ocurrir un error de acceso a momento de
ejecucin.

Ma. de los Angeles Junco Rey

Clase Store para Object

public class Store {


private Object value;
public Store( Object v ) { value = v; }
public Object getValue( ) { return value; }

public void setValue( Object v ) { value = v; }


public String toString( ) { return value = + value; }

}
Ma. de los Angeles Junco Rey

Clase Store para Object


Store stStr = new Store(good);

objeto tipo String

Store stTime = new Store(new Time24(9,45));

objeto tipo Time24

Tanto String, como Time24 son clases hijas de Object.

Ma. de los Angeles Junco Rey

Clase Store para Object


Necesario:
regresa un Object

String str = (String) stStr.getValue( );


str += bye;
stStr.setValue(str);
Se requiere una conversin (cast)
para poder asignar el valor
regresado

Ma. de los Angeles Junco Rey

Clase Store para Object


Problema:
Actualiza el valor de stStr
equivocadamente con un objeto tipo
Integer (en lugar de String)

stStr.setValue(new Integer(50));
str = (String) stStr.getValue( );

El compilador no
detecta el error

El error se descubre al correr el programa porque


no se puede convertir un objeto tipo Integer a String

Ma. de los Angeles Junco Rey

10

Mtodos GENERALES
Sin embargo, podemos aprovechar la ventaja de
utilizar mtodos GENERALES (manejando Object) en
caso de que NO sea estrictamente necesario
conocer el TIPO de dato.
Ejemplo: Bsqueda secuencial o LastIndexOf de
Objetos que implementan el mtodo equals()

Ma. de los Angeles Junco Rey

11

Bsqueda secuencial GENERAL


public static int seqSearch (Object[] arr,
int first, int last, Object target) {
for (int i = first; i < last; i++)
if (arr[i].equals (target))
return i;
return -1;
}

Nota: Este mtodo funciona para cualquier tipo (Object)


siempre y cuando dicho tipo implemente equals().

Ma. de los Angeles Junco Rey

12

Bsqueda secuencial (prueba)


String[] strArr = {hola, mundo, adios, tierra,
pelota};
Integer[] intArr = {1,2,3,4};
Index = seqSearch(strArr, 0, 5, mundo);

// index = 1

Index = seqSearch(intArr, 0, 4, 6);

// index = -1

Ma. de los Angeles Junco Rey

13

lastIndexOf GENERAL
public static int lastIndexOf (Object[] arr, int fromIndex, Object
target) throws IndexOutOfBoundsException, NullPointerException {
if (arr == null) throw new NullPointerException(Arreglo
inexistente);
if (fromIndex < 0 || fromIndex >= arr.length)
throw new IndexOutOfBoundsException (Indice fuera de
rango);
for(int i= arr.length-1; i >= fromIndex; i--){
if(arr[i].equals(target))
return i;

}
return -1;
}
Nota: Este mtodo funciona para cualquier tipo (Object) siempre y cuando dicho
tipo implemente equals().

Ma. de los Angeles Junco Rey

Collections

14

ArrayList
Object

Object

Object

Object

ArrayList <rosas>

Ma. de los Angeles Junco Rey

15

Generics: Solucin a desventaja

de clases y/o mtodos GENERALES


Dadas las limitaciones de las colecciones y mtodos que
usan Objects se crea, a partir de la versin 5 de Java, el
concepto de Generics.

La idea general consiste en hacer declaraciones con un


tipo paramtrico que podr ser sustituido por cualquier tipo
de objeto.
La verificacin de tipos se realiza a tiempo de compilacin,
por lo que se elimina el uso de conversiones (casts) y la
posibilidad de que el programa falle a tiempo de
ejecucin.

Ma. de los Angeles Junco Rey

16

Generics
El concepto de Generics se aplica en:
Clases
Interfaces

Mtodos

Ma. de los Angeles Junco Rey

17

Creando y utilizando
colecciones genricas
Se declara una coleccin genrica con el nombre de
la misma seguido de la siguiente sintaxis: <T>
public class GenClass<T>
Para crear un objeto de la clase genrica incluyendo
el tipo de dicho objeto de la siguiente forma:
GenClass<String> objGen;

Ma. de los Angeles Junco Rey

18

Clases generalizadas con


genricos
public class Store<T> {
private T value;

public Store (T v) { value = v; }


public T getValue() { return value; }

public void setValue(T v) { value = v; }


public String toString() { return "Value = " + value; }
}
Ma. de los Angeles Junco Rey

19

Clases Genricas
Sintaxis de uso de una clase genrica:
Store <String> stStr = new Store <String> (good);

se guardarn objetos de tipo String

Store <Time24> stTime =


new Store <Time24> (new Time24(9,45));

se guardarn objetos de tipo Time24


Ma. de los Angeles Junco Rey

20

Clases Genricas
Sintaxis de uso de una clase genrica:

Ya no se requiere una conversin


(cast) para poder asignar el valor
regresado

String str = stStr.getValue( );


str += bye;

stStr.setValue(str);

Ma. de los Angeles Junco Rey

regresa algo de tipo T que,


al crear el objeto, se
especific era un String

21

Clases Genricas
Sintaxis de uso de una clase genrica:
ya no se requiere una conversin
(cast) para poder aplicar un
mtodo de la clase Time24

stTime . getValue( ) . addTime(30);


YA se puede utilizar un mtodo propio
de Time24, dado que stTime se gener
como objeto tipo Time24

regresa algo de tipo T que al crear el


objeto se especific era un objeto de
tipo Time24
Ma. de los Angeles Junco Rey

22

Interfases Genricas
Sintaxis de una interfaz genrica:

public interface Accumulator <T> {

public void add( T v );


}
Donde existira un Object,
ahora hay una T (sustituible
por cualquier tipo)

Ma. de los Angeles Junco Rey

23

Uso de interfases genricas


Sintaxis de una clase NO GENRICA
que implementa a una interfaz
genrica:

Debe ser de un tipo


especfico

public class AccumulatorTime implements Accumulator <Time24> {


private Time24 total;
public AccumulatorTime( ) {this.total = new Time24( ); }
public Time24 getTotal( ) { return this.total; }

public void add( Time24 v ) {


this.total.addTime( v.getHour( ) * 60 + v.getMinute( ) );
}

Ma. de los Angeles Junco Rey

24

Uso de interfases genricas


Sintaxis de una clase NO GENRICA que
implementa a una interfaz genrica:

public class AccumulatorNumber implements Accumulator <Number>


{
private double total;
public AccumulatorNumber( ) { this.total = 0.0; }
public double getTotal( ) { return this.total; }
public void add( Number v ) {
this.total = this.total + v.doubleValue( );
}
}

Ma. de los Angeles Junco Rey

25

Uso de interfases genricas


Sintaxis de uso de una clase NO GENRICA que
implementa a una interfaz genrica:
public class TestAccumulatorNumber {
public static void main(String[ ] args){

Integer [ ] intArr = { 7, 1, 9, 3, 8, 4};


AccumulatorNumber accNum = new AccumulatorNumber( );
for(int i=0; i<intArr.length; i++)
accNum.add(intArr[ i ]);

System.out.println(Numeric total is + accNum.getTotal( ) );

Ma. de los Angeles Junco Rey

26

Uso de interfases genricas


Sintaxis de uso de una clase GENRICA que
implementa a una interfaz genrica:
public class AccumulatorGen<T> implements Accumulator <T> {
private T total;

public AccumulatorNumber (T v ) { this.total = v; }

public T getTotal( ) { return this.total; }

public void add( T v ) {

this.total = this.total + v;
}
}
Ma. de los Angeles Junco Rey

27

La Interfaz Comparable
En java.lang est definida la interfaz Comparable que se
utiliza mucho con las colecciones genricas. Se utiliza para
definir un orden natural entre los objetos de una clase (es
decir, pueden compararse entre s)
public interface Comparable <T>
{
int compareTo (T item);

<0
== 0
>0

Ma. de los Angeles Junco Rey

obj < item


obj == item
obj > item

28

La Interfaz Comparable
public class Time24 implements Comparable <Time24> {

..
public int compareTo (Time24 item) {
int time = this.hour * 60 + this.minute;
int ttime = item.hour * 60 + item.minute;
if (time < ttime)
return -1;
else if (time == ttime)
return 0;
else
return 1;
}
}
Ma. de los Angeles Junco Rey

29

Mtodos Genricos
Se especifica el tipo genrico en la declaracin del
mtodo y debe usarse en al menos un parmetro.
public static <T> T max (T objA, T objB) {
if ( ( (Comparable <T>) objA).compareTo(objB) > 0)
return objA;
else
return objB;
}

Ma. de los Angeles Junco Rey

Se requiere la conversin
(cast) para poder aplicar el
mtodo compareTo al objeto
objA

30

Mtodos Genricos
Suponiendo que la clase Rectangle no implementa
a la interface Comparable:
Rectangle rectA = new Rectangle(4, 5);
Rectangle rectB = new Rectangle(6, 2);
Rectangle rectC = max( rectA, rectB );

Ocurre una excepcin a tiempo de corrida


porque la clase Rectangle no implementa a la
interface Comparalbe

Ma. de los Angeles Junco Rey

31

Lmites para Tipos Genricos


Para evitar las excepciones a tiempo de corrida se
pueden colocar lmites:
public static <T extends Comparable<T>> T max (T objA, T objB)
{
if ( objA.compareTo(objB) > 0)
return objA;
else
return objB;
}
Se obliga a que el tipo T sea una
clase que implemente la interfaz
Comparable

Ma. de los Angeles Junco Rey

32

Comodines
Tambin se puede indicar que el tipo mismo o alguna
superclase del mismo implementa o hereda de quien
se necesita.
public static <T extends Comparable<? super T>> T max (T a, T b)
{
.
}
T o una de sus
superclases implementa a
Comparable

Ma. de los Angeles Junco Rey

33

Bsqueda binaria genrica


public static <T extends Comparable<? super T>>
int binarySearch (T[] arr,int first,int last, T target){

int mid;
T midValue;
while (first < last) {
mid = (first+last)/2;
midValue = arr[mid];
if (target.compareTo(midValue) == 0)
return mid;
else

if (target.compareTo(midValue) < 0)
last = mid;
else

first = mid+1;

}
return -1;
}
Ma. de los Angeles Junco Rey

34

Puntos importantes sobre


genricos
Los tipos primitivos NO pueden ser usados como parmetros
de tipo:
StoreGen <int> x;

// Error

No se pueden instanciar tipos genricos


new T();

// Error

No se pueden crear arreglos de tipos genricos


new T[10];

// Error

No se pueden instanciar arreglos de tipos parametrizados


new StoreGen<String>[10]; // Error

Ma. de los Angeles Junco Rey

35

Clase Arrays
Ma. de los Angeles Junco Rey

36

Arrays.toString(arr)
public static String toString (Object[] arr) {

if (arr == null) return "null";


else
if (arr.length == 0)

return "[]";

String str = "[" + arr[0];


for (int i = 1; i < arr.length; i++)
str += ", " + arr[i];
str += "]";
return str;
}

Ma. de los Angeles Junco Rey

37

Uso de la clase Arrays


String[] strArr = {"hola", "adios", "examen", "programacion", "hola", "hola",
"estructuras", "dragon", "rojo"};
Integer[] intArr = {1, 9, 18, 1, 0, 2, 32, 4, 5};

System.out.println("\nArreglo de palabras: " + Arrays.toString(strArr));


System.out.println("\nArreglo de numeros: " + Arrays.toString(intArr));

Arrays.sort(strArr);
System.out.println("\nArreglo de ordenado: " + Arrays.toString(strArr));

int index = Arrays.binarySearch(strArr, 0, strArr.length, "examen");


System.out.println("\nLa palabra: examen, esta en la posicion " + index);

Ma. de los Angeles Junco Rey

S-ar putea să vă placă și