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
的原始形式;你应该在那里提供一个类型参数。
我正在尝试学习如何使用泛型,为此,我正在创建自己的数据结构,类似于带有迭代器和所有内容的列表。
最上面的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
的原始形式;你应该在那里提供一个类型参数。