我正在实现一个包含对象ArrayList的接口。它使用以下代码将ArrayList作为Collection类型返回。
public class NetworkImpl implements Network {
private Collection<Station> stationList = new ArrayList<Station>();
public Collection<Station> getStations() {
return stationList;
}
}
在我填充了stationList ArrayList之后,我无法直接访问各个站点,我将如何进行此操作?我尝试了以下但它不起作用:
public class Test {
public static void main(String args[]) {
Network newNetwork = new NetworkImpl(); // This is implemented and populated elsewhere
newNetwork.getStations().get(0);
}
}
答案 0 :(得分:6)
如果您需要随机访问收藏集的元素,getStations()
应该返回List<Station>
而不是Collection<Station>
。
当然,您可以将返回的Collection
强制转换为List
或ArrayList
(使用instanceof
后验证其类型),但如果方法返回{{ 1}},无法保证其实现在一天内不会更改以返回Collection
,这会破坏依赖于随机访问的代码。
另一种选择是根据返回的Set
- ArrayList
构建Collection
,这样可以保证最终获得new ArrayList<Station>(newNetwork.getStations())
,无论何种类型该方法返回ArrayList
。
答案 1 :(得分:1)
您应该iterate使用Iterator {/ 3>} {{3}}
或者,正如@Eng.Fouad所建议的那样,从Java 5开始,您可以在实现中指定更窄的返回类型:
public class NetworkImpl implements Network {
private List<Station> stations = new ArrayList<Station>();
// covariant return type: narrower than Collection<List>
public List<Station> getStations() {
return stations ;
}
}
答案 2 :(得分:1)
Collection接口没有get(index)方法。请在这里找到api [http://docs.oracle.com/javase/6/docs/api/java/util/Collection.html][1]
相反,在getStations();
上使用iterator()方法Iterator itr = newNetwork.getStations().iterator();
while(itr.hasNext()) {
itr.next(); // object you needed
}
答案 3 :(得分:0)
查看Collection界面。
显然有两种方法可以访问集合中的项目。有iterator()允许您以某种顺序逐步浏览集合中的所有元素,并且toArray()允许您通过索引访问元素。
答案 4 :(得分:-2)
在这种情况下,你可以将Collection转换为List
((List<Station>)newNetwork.getStations()).get(0);