I have a generic java class that stores comparables:
public class MyGenericStorage<T extends Comparable<T>> {
private T value;
public MyGenericStorage(T value) {
this.value = value;
}
//... methods that use T.compareTo()
}
I also have an abstract class called Person:
public abstract class Person implements Comparable<Person>
and two concrete subclasses, Professor and Student:
public class Professor extends Person
public class Student extends Person
now when I want to create a MyGenericStorage like so, I get an 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());
I think this is because I have a fundamental problem with understanding generics. Can someone explain this to me, and also, how to fix it?
EDIT:
I have changed MyGenericStorage to the following:
public class MyGenericStorage<T extends Comparable<? super T>>
and now it seems to work. Can someone explain why?
You can fix this with the following declaration for MyGenericStorage:
This means that
Tmust have aComparableimplementation that accepts some supertype ofT. In the case ofStudentandProfessor, the supertype represented by the bound (?) isPerson.Update: “now it seems to work. Can someone explain why?”
Well, I tried in my original answer, but let me give it another shot.
? super Tmeans “some supertype of T”. SupposeTin this case is Student. So, Student must implement Comparable “for some supertype of Student”StudentextendsPerson, which implementsComparable<Person>. So, Student does indeed implement Comparable “for some supertype of Student”.If you have questions about Java Generics, the best place to start is Angelika Langer’s FAQ. In this case, the entry about bounded wild-cards may be helpful.