我无法理解方法。我有方法需要填写,但我真的不明白第一个。 Iterable如何成为返回类型以及它是如何使用的?一个例子就是很棒..
@Override
public Iterable<ClientInterface> getNeighbours() {
return null;
}
@Override
public void addNeighbour(ClientInterface newNeighbour){
//TODO Implement me!
}
@Override
public void removeNeighbour(String clientID) {
//TODO Implement me!
}
答案 0 :(得分:7)
看起来你的类应该有Iterable<ClientInterface>
的实现作为类成员,比如ArrayList。
我们以此为例:
public class Bus {
private ArrayList<Person> riders;
... //constructors and other methods
public Iterable<Person> getRiders() {
return riders;
}
... //other methods
}
答案 1 :(得分:6)
一切都可以是返回类型:枚举,类,接口,int,异常等。
Iterable
是一个interface
,可以用来在foreach调用中使用return(这就是为什么你可以使用for(T something : AnArrayList)
因为ArrayList<T>
实现Iterable<T>
)
现在,我的回答包含一个例子:
我们有一个方法getNeighbours
,它返回Iterable<ClientInterface>
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>();
}
好吧,好吧,因为Iterable
只是我们需要实现方法或使用实现的接口。
由于这是我们应该手动完成的事情,我们应该自己实现这些方法。
唯一的方法(在Java8中,有3种方法但我们会忽略它)是iterator()
,它返回iterator
。
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return null;
}
};
}
Iterator
是另一个接口,用于提供迭代集合的逻辑,项目列表等。
我们被迫实施两种方法: hasNext 和 next
hasNext
用于确定是否有更多项要迭代,next
用于迭代它。
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return new Iterator<ClientInterface>()
{
@Override
public boolean hasNext()
{
return false;
}
@Override
public ClientInterface next()
{
return null;
}
};
}
};
}
我们需要记住哪个是我们的最后位置,所以我们将在迭代器中创建一个字段。
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return new Iterator<ClientInterface>()
{
private int position;
@Override
public boolean hasNext()
{
return false;
}
@Override
public ClientInterface next()
{
return null;
}
};
}
};
}
问题在于:我们应该迭代什么?这取决于你,一个例子可能是:
public Iterable<ClientInterface> getNeighbours()
{
return new Iterable<ClientInterface>()
{
@Override
public Iterator<ClientInterface> iterator()
{
return new Iterator<ClientInterface>()
{
private int position;
private ClientInterface[] items = new ClientInterface[]{new ClientInterface(), new ClientInterface()};
@Override
public boolean hasNext()
{
return position != items.length;
}
@Override
public ClientInterface next()
{
if (!hasNext()) throw new NoSuchElementException();
return items[position++];
}
};
}
};
}
请注意我们如何创建一个项目数组,并使用我们的两个方法hasNext
和next
来提供迭代它的方法。
next
的每次调用都会增加内部指针,而我们的hasNext方法只会检查指针是否到达数组的末尾。
像ArrayList
,LinkedList
这样的集合已经为你做了更好的工作(实现remove
方法)你可以使用ArrayList.iterator()
现在你可以这样写:
for (ClientInterface el : yourClass.getNeighbours())
{
System.out.println(el);
}
答案 2 :(得分:2)
Iterable<T>
是一个界面。这意味着当您从方法接收它作为返回值时,您实际上会收到它的实现。因此,虽然您不知道该实现的名称是什么(实现Iterable<T>
接口的类的名称),但您仍然可以访问它实现的方法并采取行动。
一些内置实现包括ArrayList
,LinkedList
,HashSet
,PriorityQueue
和Stack
。
当您需要返回接口类型时,必须返回它的实现。