如何使用两种不同的泛型类型创建扩展Iterable的Java接口?

use*_*978 21 java generics interface

理想情况下,它看起来像这样(上下文无关紧要):

public interface myInterface extends Iterable<Point>, Iterable<Segment> { ... }
Run Code Online (Sandbox Code Playgroud)

但这在Java中是不允许的.我怎样才能实现这种行为?

Grz*_*Żur 19

不幸的是你不能.在Java中,您不能使用以下签名的两种方法:

Iterator<Point> iterator();
Iterator<Segment> iterator();
Run Code Online (Sandbox Code Playgroud)

在一个类或接口中.


Arn*_*ter 16

正如其他人之前所说,这是不可能的.更好地使用委托而不是像这样的多个实现:

public interface MyInterface {
  Iterable<Point> points();
  Iterable<Segment> segments();
}
Run Code Online (Sandbox Code Playgroud)

所以,你可以循环使用:

MyInterface my = ...;
for (Point p : my.points()) {
  ...
}
for (Segment s : my.segments()) {
  ...
}
Run Code Online (Sandbox Code Playgroud)


fge*_*fge 9

你不能.由于类型擦除,在字节码中,因此在运行时,Iterable<Whatever>变为Iterable.

因此,在运行时,您的类的原型将是:

public interface myInterface extends Iterable, Iterable { ... }
Run Code Online (Sandbox Code Playgroud)

考虑到这一点,您如何确定要迭代的类?


gre*_*dha 5

作为一种可能的解决方法,您可以为所需的迭代创建接口.

public interface SegmentIterable{
    public Iterator<Segment> segmentIterator();
}

public interface PointIterable{
    public Iterator<Point> pointIterator();
}
Run Code Online (Sandbox Code Playgroud)

它并不理想,但只要您想要迭代的东西数量有限,就可以通过.