5

我有一个通用的 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>> 

现在它似乎工作了。有人可以解释为什么吗?

4

3 回答 3

6

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

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

这意味着T必须有一个Comparable接受某些超类型的实现T。在 and 的情况下Student,由 bound( )Professor表示的超类型是。?Person


更新:“现在它似乎起作用了。有人可以解释为什么吗?”

好吧,我尝试了原始答案,但让我再试一次。

? super T意思是“T的一些超类型”。假设T在这种情况下是学生。因此,Student 必须实现 Comparable “对于 Student 的某些超类型”

Studentextends Person,它实现了Comparable<Person>. 因此,Student 确实实现了 Comparable “对于某些超类型的 Student”。

如果您对 Java 泛型有任何疑问,最好从Angelika Langer 的 FAQ 开始。在这种情况下,关于有界通配符的条目可能会有所帮助。

于 2011-11-29T18:13:33.217 回答
5

您的问题是Personextends Comparable<Person>,所以没关系,但是Studentextends Person ,因此它扩展Comparable<Person>notComparable<Student>

在您所说的约束中<T extends Comparable<T>>,因此它们必须是完全相同的类型。派生类型是不可接受的

于 2011-11-29T17:57:55.313 回答
1
public class MyGenericStorage<T extends Comparable<T>>

以上要求您将类型赋予泛型类以扩展与自身可比的类。简而言之,您是说Person必须实现Comparable<Student>and Comparable<Professor>。这就是它不能使用的原因。

于 2011-11-29T18:01:06.220 回答