タイプは2つのスーパータイプを持つことはできませんG<X> and G<Y> where X!=Y
-おそらく消去のためです。
問題を解決する1つの方法は、反復する型の型パラメーターを使用することです。
interface IA<X extends A> extends Iterable<X>
{
@Override Iterator<X> iterator();
}
interface IB extends IA<B>
{
@Override Iterator<B> iterator();
}
私は通常それを避けます、それはただもっと複雑です。
あなたの例では、そもそも拡張するIterable<A>
ことはおそらく良い考えではありません。例えば
class Team implements Iterable<Member>
{
public Iterator<Member> iterator() { ... }
}
for(Member member : team) ...
しかし、チームの概念は、おそらく単なるメンバーの集まりよりも広いものです。それはより明確かもしれません
class Team
{
Iterable<Member> members() { ... }
}
for(Member member : team.members()) ...
その場合、タイプは次のように設計できます。
interface IA
{
Iterable<? extends A> members();
}
interface IB extends IA
{
@Override
Iterable<? extends B> members();
}
Iterable
代わりにもっとリラックスすべきだったかどうかを疑問視することもできます
public interface Iterable<T>
Iterator<T> iterator();
する方がいいでしょうか
public interface Iterable<T>
Iterator<? extends T> iterator();