Pregunta Clase java genérica que almacena comparables


Tengo una clase java genérica que almacena comparables:

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, Profesor y Estudiante:

public class Professor extends Person
public class Student extends Person

ahora, cuando quiero crear un MyGenericStorage así, 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 con la comprensión de los genéricos. ¿Puede alguien explicarme esto, y también, cómo solucionarlo?

EDITAR:

He cambiado MyGenericStorage a lo siguiente:

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

Y ahora parece funcionar. ¿Alguien puede explicar por qué?


5
2017-11-29 17:53


origen


Respuestas:


Puede solucionar esto con la siguiente declaración para MyGenericStorage:

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

Esto significa que T debe tener un Comparable Implementación que acepta algún supertipo de T. En el caso de Student y Professor, el supertipo representado por el límite (?) es Person.


Actualización: "ahora parece funcionar. ¿Puede alguien explicar por qué?"

Bueno, probé en mi respuesta original, pero déjame darle otra oportunidad.

? super T significa "algún supertipo de T". Suponer 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 sí implementa Comparable "para algún supertipo de Estudiante".

Si tiene preguntas sobre Java Generics, el mejor lugar para comenzar es Preguntas frecuentes de Angelika Langer. En este caso, la entrada sobre comodines acotados puede ser útil.


6
2017-11-29 18:13



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

En tu constricción estás diciendo <T extends Comparable<T>>, asi deben ser los exactamente el mismo tipo. Tipos derivados no son aceptables.


5
2017-11-29 17:57



public class MyGenericStorage<T extends Comparable<T>>

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


1
2017-11-29 18:01