Java - Comodines en Collections

 
Vista:

Comodines en Collections

Publicado por Sergio (1 intervención) el 22/05/2010 12:01:12
A ver si me explico, estoy a punto de subir a la certificacion SCJP 6.0 y tengo el libro de preparación para la certificación en ingles, pero hay temas como por ejemplo los comodines que no me aclaro mucho, a ver si alguien tiene un enlace a algun sitio que este en español y sea clarificador de esta tecnica que se implanto en la version 5 de java los genericos, (sobre todo comodines). Seria de gran ayuda. Gracias a todos un saludo.
PD: He buscado información por internet pero no me aclaro mucho.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Comodines en Collections

Publicado por aitor (85 intervenciones) el 23/05/2010 01:27:01
Los argumentos comodines pueden limitar los argumentos de métodos y constructores e interfaces graficas y clases.
También pueden limitar que en una jerarquía de clases que hereda una de otras puedan gastar métodos genéricos. Ya que es un tema difícil de explicar te muestro unos ejemplos de unas pequeñas clases que tengo.

public class dos {
int x,y;

public dos(int x, int y) {
this.x = x;
this.y = y;
}
}

public class tres extends dos{
int z;

public tres(int x, int y,int z) {
super(x,y);
this.z = z;
}

}

public class cuatro extends tres{

int t;

public cuatro(int x, int y,int z,int t) {
super(x,y,z);
this.t = t;
}
}

//En la clase siguiente “Coords” estamos limitando a que el atributo “T“ sea de un tipo “dos” y se hace mediante esta línea <T extends dos>. Pero se le puede pasar un tipo tres o cuatro ya que estos heredan de dos. Pero un paramtro pasado de tipo dos no puede llamar al método mostrarCordenadasXYZ(Coords<? extends tres> c) porque está limitando. Al revés sí que se puede hacer , pasado un objeto tres o cuatro si que puedes llamar a un método que está limitado por argumentos de tipo dos.

public class Coords<T extends dos> {

private T[] coords;

public Coords(T[] coords) {
this.coords = coords;
}

static void mostrarCordenadasXY(Coords<?> c) {

System.out.println("X Y Cordinantes:");
for (int i = 0; i < c.coords.length; i++) {

System.out.println(c.coords[i].x + "=X Y=" + c.coords[i].y);
}
}

static void mostrarCordenadasXYZ(Coords<? extends tres> c) {

System.out.println("X Y Cordinantes:");
for (int i = 0; i < c.coords.length; i++) {

System.out.println(c.coords[i].x + "=X Y=" + c.coords[i].y + " z=" + c.coords[i].z);
}
}

static void mostrarTodos(Coords<? extends cuatro> c) {
System.out.println("X Y Cordinantes:");
for (int i = 0; i < c.coords.length; i++) {

System.out.println(c.coords[i].x + "=X Y=" + c.coords[i].y + " z=" + c.coords[i].z+" t="+c.coords[i].t);
}
}
}

// el main
/**
*
* @author Aitor
*/
public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
dos[] d = new dos[3];
d[0] = new dos(1, 2);
d[1] = new dos(3, 4);
d[2] = new dos(5, 6);

tres[] t = new tres[3];
t[0] = new tres(1, 2, 7);
t[1] = new tres(3, 4, 8);
t[2] = new tres(5, 6, 9);

cuatro[] s = new cuatro[3];
s[0] = new cuatro(1, 2, 7,544);
s[1] = new cuatro(3, 4, 8,56);
s[2] = new cuatro(5, 6, 9,78);

Coords c = new Coords(s);
c.mostrarCordenadasXY(c);
}
}

//PD. espero que te sirva de algo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Comodines en Collections

Publicado por aitor (85 intervenciones) el 23/05/2010 01:36:10
Los argumentos comodines pueden limitar los argumentos de métodos y constructores e interfaces graficas y clases.
También pueden limitar que en una jerarquía de clases que hereda una de otras puedan gastar métodos genéricos. Ya que es un tema difícil de explicar te muestro unos ejemplos de unas pequeñas clases que tengo.

public class dos {
int x,y;

public dos(int x, int y) {
this.x = x;
this.y = y;
}
}

public class tres extends dos{
int z;

public tres(int x, int y,int z) {
super(x,y);
this.z = z;
}

}

public class cuatro extends tres{

int t;

public cuatro(int x, int y,int z,int t) {
super(x,y,z);
this.t = t;
}
}

//En la clase siguiente “Coords” estamos limitando a que el atributo “T“ sea de un tipo “dos” y se hace mediante esta línea <T extends dos>. Pero se le puede pasar un tipo tres o cuatro ya que estos heredan de dos. Pero un paramtro pasado de tipo dos no puede llamar al método mostrarCordenadasXYZ(Coords<? extends tres> c) porque está limitando. Al revés sí que se puede hacer , pasado un objeto tres o cuatro si que puedes llamar a un método que está limitado por argumentos de tipo dos.

public class Coords<T extends dos> {

private T[] coords;

public Coords(T[] coords) {
this.coords = coords;
}

static void mostrarCordenadasXY(Coords<?> c) {

System.out.println("X Y Cordinantes:");
for (int i = 0; i < c.coords.length; i++) {

System.out.println(c.coords[i].x + "=X Y=" + c.coords[i].y);
}
}

static void mostrarCordenadasXYZ(Coords<? extends tres> c) {

System.out.println("X Y Cordinantes:");
for (int i = 0; i < c.coords.length; i++) {

System.out.println(c.coords[i].x + "=X Y=" + c.coords[i].y + " z=" + c.coords[i].z);
}
}

static void mostrarTodos(Coords<? extends cuatro> c) {
System.out.println("X Y Cordinantes:");
for (int i = 0; i < c.coords.length; i++) {

System.out.println(c.coords[i].x + "=X Y=" + c.coords[i].y + " z=" + c.coords[i].z+" t="+c.coords[i].t);
}
}
}

// el main
/**
*
* @author Aitor
*/
public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
dos[] d = new dos[3];
d[0] = new dos(1, 2);
d[1] = new dos(3, 4);
d[2] = new dos(5, 6);

tres[] t = new tres[3];
t[0] = new tres(1, 2, 7);
t[1] = new tres(3, 4, 8);
t[2] = new tres(5, 6, 9);

cuatro[] s = new cuatro[3];
s[0] = new cuatro(1, 2, 7,544);
s[1] = new cuatro(3, 4, 8,56);
s[2] = new cuatro(5, 6, 9,78);

Coords c = new Coords(s);
c.mostrarCordenadasXY(c);
}
}

//PD. espero que te sirva de algo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Comodines en Collections

Publicado por aitor (85 intervenciones) el 23/05/2010 01:36:13
Los argumentos comodines pueden limitar los argumentos de métodos y constructores e interfaces graficas y clases.
También pueden limitar que en una jerarquía de clases que hereda una de otras puedan gastar métodos genéricos. Ya que es un tema difícil de explicar te muestro unos ejemplos de unas pequeñas clases que tengo.

public class dos {
int x,y;

public dos(int x, int y) {
this.x = x;
this.y = y;
}
}

public class tres extends dos{
int z;

public tres(int x, int y,int z) {
super(x,y);
this.z = z;
}

}

public class cuatro extends tres{

int t;

public cuatro(int x, int y,int z,int t) {
super(x,y,z);
this.t = t;
}
}

//En la clase siguiente “Coords” estamos limitando a que el atributo “T“ sea de un tipo “dos” y se hace mediante esta línea <T extends dos>. Pero se le puede pasar un tipo tres o cuatro ya que estos heredan de dos. Pero un paramtro pasado de tipo dos no puede llamar al método mostrarCordenadasXYZ(Coords<? extends tres> c) porque está limitando. Al revés sí que se puede hacer , pasado un objeto tres o cuatro si que puedes llamar a un método que está limitado por argumentos de tipo dos.

public class Coords<T extends dos> {

private T[] coords;

public Coords(T[] coords) {
this.coords = coords;
}

static void mostrarCordenadasXY(Coords<?> c) {

System.out.println("X Y Cordinantes:");
for (int i = 0; i < c.coords.length; i++) {

System.out.println(c.coords[i].x + "=X Y=" + c.coords[i].y);
}
}

static void mostrarCordenadasXYZ(Coords<? extends tres> c) {

System.out.println("X Y Cordinantes:");
for (int i = 0; i < c.coords.length; i++) {

System.out.println(c.coords[i].x + "=X Y=" + c.coords[i].y + " z=" + c.coords[i].z);
}
}

static void mostrarTodos(Coords<? extends cuatro> c) {
System.out.println("X Y Cordinantes:");
for (int i = 0; i < c.coords.length; i++) {

System.out.println(c.coords[i].x + "=X Y=" + c.coords[i].y + " z=" + c.coords[i].z+" t="+c.coords[i].t);
}
}
}

// el main
/**
*
* @author Aitor
*/
public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
dos[] d = new dos[3];
d[0] = new dos(1, 2);
d[1] = new dos(3, 4);
d[2] = new dos(5, 6);

tres[] t = new tres[3];
t[0] = new tres(1, 2, 7);
t[1] = new tres(3, 4, 8);
t[2] = new tres(5, 6, 9);

cuatro[] s = new cuatro[3];
s[0] = new cuatro(1, 2, 7,544);
s[1] = new cuatro(3, 4, 8,56);
s[2] = new cuatro(5, 6, 9,78);

Coords c = new Coords(s);
c.mostrarCordenadasXY(c);
}
}

//PD. espero que te sirva de algo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar