如何解决迭代器期望Object实例在实现它的类之外
忍不住觉得标题有点含糊,对此感到抱歉。我无法更好地描述它。
我会更详细一些;我试图弄清楚如何使迭代器以我希望它在实现它的类之外的方式工作。我无法设法找到有关我的问题的任何信息。这是大学作业的一部分,AlphaTest.java应该保留不变。
我有一个类Alpha,它具有一个遵循双链表原理Bravo的类。 Bravo将保留指向列表中上一个和下一个实例的链接。
我希望能够使用在Alpha类中实现的迭代器来迭代链接列表,以便可以使用如下所示的for循环轻松地遍历每个实例:
for(Bravo b: alphaInstance) {...}
。
我在Alpha类本身中实现了预期的功能,但是一旦在Alpha类之外尝试了相同的操作(例如在AlphaTest中),它就无法实现预期的功能。一旦尝试,就会遇到以下错误:
Error:(220,23) java: incompatible types: java.lang.Object cannot be converted to models.Bravo
它希望我像这样将实例实例化为对象:
for(Object o: alphaInstance) {...}
我当然可以将对象投给Bravo。但这不是任务的一部分。
请参阅下面的代码,以了解问题所在。该问题可以在AlphaTest.java
中找到。
Alpha.java
class Alpha<E extends Bravo> implements Iterable<Bravo> {
Bravo head;
public Alpha(Bravo head) {
this.head = head;
}
public void example() {
for(Bravo b: this) {
// This works,it's succesfully recognized as an instance of Bravo.
}
}
@Override
public Iterator<Bravo> iterator() {
return new BravoIterator(this.head);
}
private class BravoIterator implements Iterator<Bravo> {
private Bravo currentBravo;
public BravoIterator(Bravo head) {
this.currentBravo = head;
}
@Override
public boolean hasNext() {
return this.currentBravo != null;
}
@Override
public Wagon next() {
Bravo data = this.currentBravo;
this.currentBravo = this.currentBravo.getNextBravo();
return data;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
}
AlphaTest.java
{...}
@BeforeEach
private void setup() {
// Assume this is a doubly linked list
Bravo bravo = new Bravo(...);
instanceOfAlpha = new Alpha(bravo);
}
public T1_checkImplementationOfIterableInterface() {
for(Bravo b: instanceOfAlpha) { // <---------------------------------------------[This is the problem]
// This does not work,it expects an instance of Object.
}
}
{...}
解决方法
您误解了该错误。
正在发生的事情是,instanceOfAlpha
是一个表达式,其类型最终为Alpha
-您已经删除了对该变量的定义,但是当您为该变量创建值时,它似乎已经很明显了该变量也具有原始类型。 Alpha
就是所谓的原始类型-一种具有类型参数,但缺少参数的类型。
问题是,原始类型有点奇怪:一旦您变得原始,有关它的所有内容都是原始的,即使没有使用任何泛型的事物也无法指定。因此,原始iterator()
表达式的Alpha
方法返回原始Iterator
(您认为它返回了Iterator<Bravo>
,但没有)。因此,对其进行迭代将返回基本对象。因此,您的for循环已损坏; for (Object b : instanceOfAlpha){}
将会编译; for (Bravo b : instanceOfAlpha){}
不会。
通常的解决方法是,当编译器向您发出警告时,您不应该只去__(ツ)_ /?我不知道这些意思是什么,所以我就像三只猴子,只是希望我不了解的一切完全不相关。
不是。真正的解决方法是:修复泛型,以免收到这些警告。
您没有粘贴足够的代码来确切地告诉您在此处需要执行的操作;可能会使instanceOfAlpha
被声明为Alpha<?>
。一般来说,您的第一个粘贴(属于Alpha类)看起来像您不了解泛型的工作原理。在其中提到Bravo
的大多数地方都应该改用E
。泛型有点棘手;也许您只想完全退出。完全摆脱<E extends Bravo>
部分,然后将其余部分几乎保持原样,这也可以解决问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。