gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:10:23 25 4
gpt4 key购买 nike

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

最上面的类声明为:

public class BasicList<A> implements Iterable {
}

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

还有另一个列表,称为 DescendingList,它的作用几乎相同,只是这一次,由于迭代器不同,您会得到另一个输出。我给这个列表一个比较器以使迭代器工作。比较器只是一个接口(interface):

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

降序列表如下所示:

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

这个想法是它可以与通过 Bigger 接口(interface)进行比较的任何类型的对象一起使用。

现在我有一个抽象类:

public abstract class Rock implements Bigger<Rock> {
}

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

public class Mineral extends Rock {
}

所以,眼前的问题是,虽然我可以轻松创建一个新的 BasicList,其中充满了这样的矿物质:

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>"

我真的不明白为什么会发生这种情况。我很确定我以某种方式弄乱了类型参数,但我真的不确定在哪里。这应该可以以某种方式解决(至少不删除任何类/接口(interface) - 类头可能并且可能完全困惑)。预先感谢您提供的任何帮助。

最佳答案

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

因为是消费者(类型参数作为方法参数),所以类型参数A其声明需要一个下限( super )。

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

这边走Mineral将在其自己的范围内。

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

关于Java:数据结构和通配符的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33742660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com