gpt4 book ai didi

java - 如何将类的迭代器转换为其子类的迭代器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:45:28 26 4
gpt4 key购买 nike

我试图将一个类的迭代器转换为该类的子类的迭代器。这给了我一个“不可转换类型”的错误。为什么这是不可能的,解决它的最优雅的方法是什么? (或者,如果是的话,为什么这是个坏主意?)

在这种情况下,使用 for-each 循环不是解决方案:我正在尝试实现 iterator(),最简单的方法是返回 iterator( ) 我类的一个字段,但那个字段没有所需的确切类型。我也无法更改我的 iterator() 的签名。

public interface SomeoneElsesInterface {
public Iterator<SomeoneElsesInterface> iterator();
}

public abstract class MyAbstractClass implements SomeoneElsesInterface {
final MyAbstractClass[] things;
public MyAbstractClass(SomeoneElsesInterface... things) {
this.things = (MyAbstractClass[]) things;
}
}

public class MyClass extends MyAbstractClass {
public MyClass(MyAbstractClass thing1, MyAbstractClass thing2) {
super(thing1, thing2);
}

public Iterator<SomeoneElsesInterface>() {
return (Iterator<SomeoneElsesInterface>) Arrays.asList(things).iterator();
}
}

当然,我可以只更改 things 的类型。但是,在那种情况下,我需要在其他地方进行大量类型转换。我知道我的构造函数不会用不是 MyAbstractClass 的对象调用,但无论如何我都无法更改接口(interface)。

最佳答案

这看起来就像使用 explicit type argument specification 一样简单:

public class MyClass extends MyAbstractClass {
// ...

public Iterator<SomeoneElsesInterface> iterator() {
return Arrays.<SomeoneElsesInterface>asList(things).iterator();
}
}

问题是 Arrays#asList()正在推断您想要一个 List<MyAbstractClass> 类型的列表, 这将产生一个 Iterator<MyAbstractClass> 类型的迭代器.自 Iterator的类型参数不是协变,您不能提供 Iterator<MyAbstractClass>哪里有Iterator<SomeoneElsesInterface>是必须的。通过强制Arrays#asList()创建 List<SomeoneElsesInterface> 类型的列表,如上所示,您还会从对 Iterable#iterator() 的调用中返回预期的迭代器类型。 .

SomeoneElsesInterface 的作者指定其 iterator() 的返回类型会更好方法为 Iterator<? extends SomeoneElsesInterface> .

关于java - 如何将类的迭代器转换为其子类的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11493909/

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