访问ArrayList作为类型Collection <object> </object>返回

时间:2015-03-12 10:33:47

标签: java arraylist collections

我正在实现一个包含对象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);
    }
}

5 个答案:

答案 0 :(得分:6)

如果您需要随机访问收藏集的元素,getStations()应该返回List<Station>而不是Collection<Station>

当然,您可以将返回的Collection强制转换为ListArrayList(使用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);