2011-11-29 9 views
5

que tienen una clase Java genérico que almacena los elementos de comparación:clase java genérico que almacena los elementos de comparación

public class MyGenericStorage<T extends Comparable<T>> { 
    private T value; 

    public MyGenericStorage(T value) { 
     this.value = value; 
    } 

    //... methods that use T.compareTo() 
} 

también tengo una clase abstracta llamada Persona:

public abstract class Person implements Comparable<Person> 

y dos subclases concretas, el profesor y el estudiante :

public class Professor extends Person 
public class Student extends Person 

ahora cuando quiero crear un MyGenericStorage como tal, me sale un error:

//error: type argument Student is not within bounds of type-variable T 
MyGenericStorage<Student> studStore = new MyGenericStorage<Student>(new Student()); 

//this works: 
MyGenericStorage<Person> persStore = new MyGenericStorage<Person>(new Student()); 

Creo que esto se debe a que tengo un problema fundamental para comprender los genéricos. ¿Alguien me puede explicar esto y también cómo arreglarlo?

EDIT:

He cambiado MyGenericStorage a lo siguiente:

public class MyGenericStorage<T extends Comparable<? super T>> 

y ahora parece que funciona. ¿Alguien puede explicar por qué?

+0

¿Qué pasa si lo cambia a 'clase pública Estudiante extiende persona implementa Comparable '? –

Respuesta

6

Puedes solucionar este problema con la siguiente declaración para MyGenericStorage:

class MyGenericStorage<T extends Comparable<? super T>> { … 

Esto significa que T debe tener una aplicación Comparable que acepte alguna supertipo de T. En el caso de Student y Professor, el supertipo representado por el límite (?) es Person.


Update: "Ahora parece que funciona ¿Puede alguien explicar por qué.?"

Bueno, probé en mi respuesta original, pero permítanme darle otra oportunidad.

? super T significa "algún supertipo de T". Supongamos que T en este caso es Estudiante.Entonces, el Estudiante debe implementar Comparable "para algún supertipo de Estudiante"

Student se extiende Person, que implementa Comparable<Person>. Entonces, el Estudiante efectivamente implementa Comparable "para algún supertipo de Estudiante".

Si tiene preguntas sobre Java Generics, el mejor lugar para comenzar es Angelika Langer's FAQ. En este caso, the entry about bounded wild-cards puede ser útil.

+0

Muchas gracias por la explicación, no vi su respuesta en el momento en que edité la pregunta :-) – avf

5

Su problema es que Person se extiende Comparable<Person>, así que está bien, pero Student extiende persona y por lo tanto se extiende Comparable<Person> no Comparable<Student>.

En su restricción está diciendo <T extends Comparable<T>>, por lo que debe ser el mismo tipo . Los tipos derivados no son aceptables.

1
public class MyGenericStorage<T extends Comparable<T>> 

Lo anterior requiere que usted tenga el tipo dado a la clase genérica para extender una clase que es omparable consigo misma. En resumen, está diciendo que Person debe implementar Comparable<Student> y Comparable<Professor>. Es por eso que no puede ser usado.

Cuestiones relacionadas