Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Interfaces

Hola a todos,

llevo años con JAVA y hoy un alumno me ha planteado una duda que la verdad me ha dejado en la duda.

Tenemos la clase Par con dos propiedades (x e y enteras). Por otro lado la clase Pixel que hereda de Par y que contiene color como String.

Como quiero usar TreeSet, pretendo ordenarlos por lo cual debe implementar el interfaz Comparable.
Quedaría como sigue

public class Par implements Comparable<Par>{
.... //tengo compareTo(Par p) desarrollado
}

public class Pixel implements Comparable<Pixel>{
.........// tengo compareTo(Pixel p) desarrollado
}

Mi pregunta es que yo pensaba que dejaría hacerlo pero da el error: "The interface Comparable cannot be implemented more than once with different arguments: Comparable<Par> and Comparable<Pixel>"

Ahora como puedo contemplar que tanto Pixel como Par pueda ser usado por estructuras Tree?.

Seguro que hay algo que me pierdo pero no encuentro la forma de hacerlo.

Gracias mil.

marzo 12, 2014 | Unregistered CommenterCarlos

Se me olvidó que Pixel hereda de Par....

public Pixel extends Par implements Comparable <Pixel>{
...// compareTo(Pixel p) está implementado.
}

marzo 12, 2014 | Unregistered CommenterCarlos

No se puede hacer como lo planteas.

Lo único que se me ocurre es lo siguiente:

public class Test {

public static void main(String[] args) {
TreeSet<Par> treeSet1 = new TreeSet<>(new Comparator<Par>() {

@Override
public int compare(Par o1, Par o2) {
return 0; // solo para que compile
}
});

TreeSet<Pixel> treeSet2 = new TreeSet<>(new Comparator<Pixel>() {

@Override
public int compare(Pixel o1, Pixel o2) {
return 0; // solo para que compile
}
});
}
}

Para las declaraciones de Par y Pixel siguientes:

public class Par {}

public class Pixel extends Par {}

marzo 12, 2014 | Registered Commenterchoces

Como curiosidad, se haría así con JavaSE 1.8

public class Test {

public static void main(String[] args) {
TreeSet<Par> treeSet1 = new TreeSet<>((Par o1, Par o2) -> o1.getAtributoPar() - o2.getAtributoPar());
TreeSet<Pixel> treeSet2 = new TreeSet<>((Pixel o1, Pixel o2) -> o1.getAtributoPixel() - o2.getAtributoPixel());
}
}

public class Par {

private int atributoPar;

public int getAtributoPar() {
return atributoPar;
}
}

public class Pixel extends Par {

private int atributoPixel;

public int getAtributoPixel() {
return atributoPixel;
}
}

marzo 12, 2014 | Registered Commenterchoces

Gracias por la información,

pero no comprendo que limitación ofrece JAVA en no poder hacer implementaciones sobre una clase heredada y su hija. Que supiera no había restricciones de este tipo. Entiendo vuestra soluciones, pero no comprendo porque se limita ese uso de implements en mi caso.

Un saludo C.

marzo 12, 2014 | Unregistered CommenterCarlos

http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ401

http://learnertobeginner.blogspot.com.es/2011/06/basics-of-java-generics.html

marzo 12, 2014 | Registered Commenterchoces

Guenas.

Siempre puedes usar un comparable que no use genéricos en la clase base y dentro de el usar instanceof para actuar en consecuencia. Es feo y guarrillo pero quizá te sirva.

Un saludo

marzo 14, 2014 | Unregistered CommenterPaposo