存储可比数据的通用java类

时间:2011-11-29 17:54:00

标签: java generics comparable nested-generics

我有一个存储可比数据的通用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>> 

现在似乎有效。有人可以解释原因吗?

3 个答案:

答案 0 :(得分:6)

您可以使用MyGenericStorage的以下声明解决此问题:

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

这意味着T必须具有Comparable实现,该实现接受T的某些超类型。对于StudentProfessor,绑定(?)表示的超类型为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>。这就是它无法使用的原因。