Общий Java-класс, в котором хранятся сопоставимые объекты

У меня есть общий Java-класс, в котором хранятся сопоставимые объекты:

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

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

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

У меня также есть абстрактный класс с именем Person:

public abstract class Person implements Comparable<Person>

и два конкретных подкласса, Professor и Student:

public class Professor extends Person
public class Student extends Person

теперь, когда я хочу создать MyGenericStorage таким образом, я получаю сообщение об ошибке:

//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());

Я думаю, это потому, что у меня есть фундаментальная проблема с пониманием дженериков. Может кто-нибудь объяснить мне это, а также как это исправить?

РЕДАКТИРОВАТЬ:

Я изменил MyGenericStorage на следующее:

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

и теперь, похоже, он работает. Может кто-нибудь объяснить, почему?

5
задан avf 29 November 2011 в 18:15
поделиться