Java:关于数据结构和通配符的泛型

Java: Generics on data structures and wildcards

我正在尝试学习如何使用泛型,为此,我正在创建自己的数据结构,类似于带有迭代器和所有内容的列表。

最上面的class声明为:

public class BasicList<A> implements Iterable {
}

它只是一个包含节点和指向下一个元素的单个指针的列表。

还有另一个名为 DescendingList 的列表,它的作用几乎相同,只是这一次,由于迭代器不同,您将获得另一个输出。我正在给这个列表一个比较器来让迭代器工作。比较器只是一个接口:

public interface Bigger<A> {
    boolean bigger(A x);
}

降序列表如下所示:

public class DescendingList<A extends Bigger<A>> extends BasicList<A> implements Iterable {
}

这个想法是它可以与任何类型的 object 一起工作,通过 Bigger 界面可以比较。

现在我有一个摘要class:

public abstract class Rock implements Bigger<Rock> {
}

最后,一个普通的 class 扩展了 Rock class:

public class Mineral extends Rock {
}

所以,手头的问题是,虽然我可以像这样轻松地创建一个新的充满矿物质的基本列表:

BasicList<Mineral> min = new BasicList<Mineral>();

我不能对 DescendingList 做同样的事情。每当我尝试使用

DescendingList<Mineral> min = new DescendingList<Mineral>();

我的 IDE (IntelliJ) 全力以赴

"Type parameter "Rock" is not within it's bound; should implement Bigger<Mineral>"

我真的不明白为什么会这样。我很确定我以某种方式弄乱了类型参数,但我真的不确定在哪里。这应该可以以某种方式解决(至少不删除任何 classes/interfaces - class headers 可能并且可能完全搞砸了)。提前感谢您提供的任何帮助。

A Mineral 不是 Bigger<Mineral>,它是 Bigger<Rock>,它与 Bigger<Mineral> 不兼容,因为即使 Mineral a Rock, Java的泛型是不变的。它需要是一个 Bigger<Rock> 因为 Rock 是如何定义的——实现 Bigger<Rock> —— 并且 DescendingList 声明类型参数 A 是一个 Bigger<A>.

因为它是一个消费者(类型参数作为方法参数),类型参数A需要在它的声明中有一个下限(super)。

class DescendingList<A extends Bigger<? super A>> // ...

这样Mineral就会在自己的范围内。

顺便说一句,您正在 BasicList 中实现 Iterable 的原始形式;你应该在那里提供一个类型参数。