我有一个存储可比数据的通用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>
和两个具体的子类,教授和学生:
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>>
现在似乎有效。有人可以解释原因吗?
答案 0 :(得分:6)
您可以使用MyGenericStorage的以下声明解决此问题:
class MyGenericStorage<T extends Comparable<? super T>> { …
这意味着T
必须具有Comparable
实现,该实现接受T
的某些超类型。对于Student
和Professor
,绑定(?
)表示的超类型为Person
。
更新:“现在它似乎有效。有人可以解释原因吗?”
好吧,我尝试了原来的答案,但让我再试一次。
? super T
表示“某些超类型的T”。假设在这种情况下T
是学生。因此,学生必须为“某些超类型学生”实施“可比较”
Student
扩展Person
,实现Comparable<Person>
。因此,学生确实实现了“对于某些超类学生”的可比性。
如果您对Java Generics有疑问,最好的起点是Angelika Langer's FAQ.在这种情况下,the entry about bounded wild-cards可能会有所帮助。
答案 1 :(得分:5)
您的问题是Person
扩展了Comparable<Person>
,所以没关系,但是Student
扩展了Person,因此扩展了Comparable<Person>
而不是Comparable<Student>
< / strong>即可。
在约束中,您说的是<T extends Comparable<T>>
,因此它们必须是完全相同的类型。派生类型不可接受。
答案 2 :(得分:1)
public class MyGenericStorage<T extends Comparable<T>>
上面要求你给泛型类赋予类型来扩展一个对它自己有用的类。简而言之,您说Person
必须实施Comparable<Student>
和Comparable<Professor>
。这就是它无法使用的原因。