一个类型不能有两个超类型G<X> and G<Y> where X!=Y
- 可能是由于擦除。
解决问题的一种方法是对要迭代的类型使用类型参数
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();