Hay una diferencia significa - en el metodo segundo el nivel de abstraction es mas alto. El ejemplo: hay metodo que hace iteracion en collection para buscar algo. Si el metodo tiene la signatura
Código:
Object findSomething(ArrayList source);
él no puede acceptar ni LinkedList ni HashSet - solo ArrayList y sus descendientes. Y si hay necesidad en metodo que busca objetos en Set - debe que escribir otro metodo.
Si el metodo tiene otra signatura:
Código:
Object findSomething(Collection source);
, él puede acceptar cualquier objetos como ArrayList, LinkedList, TreeList y otros.
Conclucion: si el codigo tiene nivel de abstraction mas alto, él es mas claro, limpio y correcto.