Ebből az AbstractList és AbstractCollection kiesik mint visszatérési típus IMHO
A példádban pont nem API-ról volt szó és arra reagáltam, tehát erről:
ArrayList<foo> foos = new ArrayList<foo>();
Attól függően, hogy mit akarsz a foos-sal kezdeni az adott függvényen belül, aszerint kell választanod.
Pl., ha előre egy adott maximális kapacitással akarod létrehozni, de a végén le akarod csonkolni a tényleges méretre (trimToSize), akkor nincs más választásod, mint az ArrayList.