Kolekcje, zwracanie typów przez metody

0

Czytam i nie mogę zrozumieć dlaczego przy pisaniu metod powinienem bardzo ściśle określać jaki typ ma być zwracany przez metodę. Wręcz odwrotnie do sytuacji deklarowania typów parametrów jakie ma przyjmować metoda, ale to rozumiem, bo mam wtedy możliwość przekazania nie tylko konkretnie np ArrayList ale też mogę przesłać LinkedList, OK. Ale dlaczego odwrotnie jest z typami zwracanymi przez metodę?

Przykład z zaznaczonymi w kodzie miejscami, co bym stracił gdybym napisał ogólniej?

import java.util.*;

class ListUtils {
	
	static void append(List list, Object[] items){
	  for (int i=0; i<items.length; i++)
	  	list.add(items[i]);
	}
	
	static ArrayList create(Object[] items){ //TU co bym 'stracił' pisząc static List create(Object[] items)

		ArrayList list = new ArrayList(); //TU co bym 'stracił' pisząc List list = new ArrayList(); Dlaczego pisać tak a nie inaczej? 
		append(list, items);
		return list;
	}
	
	static void show(List list){
		for (Iterator iter = list.iterator(); iter.hasNext();)
			System.out.println(iter.next());
	}
}
class Kolek{
    public static void main(String[] args) {
	String[] items = { "Kot", "Pies", "Slon", "Tygrys" };
	List list1 = new ArrayList();
	ListUtils.append(list1, items);
	ListUtils.show(list1);
	List list2 = ListUtils.create( new String[] { "Truskawki", "Banany" } );
	ListUtils.show(list2);
    } 

}
0

Każda kolekcja ma pewne cechy, które należy rozróżniać i odpowiednio wykorzystywać. Np ArrayList - pozwala na szybszy dostep do elementów, ale wolniej wykonywane jest wstawianie i usuwanie z wnetrza listy. LinkedList zapewnia optymalny dostęp sekwnecyjny, tanie usuwaniue i wstawianie w środek listy. Wszystko zależu od tego co chesz osiągnąć i do czego wykorzystać. Jeśli próbujesz coś zrobić na ogólnym obiekcie, to zawsze bedziesz musiał liczyć się z rzutowaniem jawnym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1