У меня есть общий 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>>
и теперь, похоже, он работает. Может кто-нибудь объяснить, почему?