クラスのイテレータをそのクラスのサブクラスのイテレータにキャストしようとしました。これにより、「変換不可能なタイプ」エラーが発生しました。なぜこれが不可能であり、それを回避するための最もエレガントな方法は何ですか?(あるいは、そうである場合、なぜそれは悪い考えですか?)
この場合、for-eachループを使用することは解決策ではありません。実装しようとしiterator()
ています。これを行う最も簡単な方法iterator()
は、クラスのフィールドの1つを返すことですが、そのフィールドには正確に必要なものがありません。タイプ。どちらの署名も変更できません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
ます。ただし、その場合は他の場所でたくさんのキャストが必要になります。コンストラクターがs以外のオブジェクトで呼び出されないことは知っていますがMyAbstractClass
、とにかくインターフェイスを変更することはできません。