Originariamente inviato da supertarmax
Salve, ad esempio potrei scrivere:

codice:
List<String> ciao= new ArrayList<String>();
Istanzio cioè un oggetto di tipo ArrayList ma lo metto in un riferimento di tipo List (che dovrebbe essere una superclasse...giusto?).
in realtà List è una interfaccia, questa dicitura serve a dichiarare che vuoi un tipo che sia in grado di fare determinate cose. Le cose che pretendi siano fatte le indichi con l'interfaccia (quindi vuoi un tipo su cui puoi fare add, remove, get ecc).
L'interfaccia (come sai) non può essere istanziata, quindi l'istanziazione la fai con una implementazione di List (che è appunto ArrayList).

se guardi qui hai le API di List e l'elenco delle sue implementazioni.
Il vantaggio reale lo hai quando usi List come parametro di un metodo, in questo modo stai implicitamente dicendo "non importa quale implementazione fornisci, mi basta che mi dai qualcosa che sia in grado di soddisfare l'interfaccia".

In questo modo uso i metodi della superclasse...non quelli di ArrayList.
che vantaggio ne posso trarre? Ovvero quali sono le differenze rispetto a:
Originariamente inviato da supertarmax
codice:
List<String> ciao= new List<String>();
non valido perché List è una interfaccia

Originariamente inviato da supertarmax
oppure:

codice:
ArrayList<String> ciao= new ArrayList<String>();

grazie a tutti
qui usi direttamente l'implementazione, ti ho detto sopra la differenza.
Qualora dovessi usare la tua lista dentro una classe (membro private quindi) e non la usi mai come parametro di qualche metodo allora le due diciture sono equivalenti, potresti usare la seconda per sfruttare a pieno i metodi tipici di ArrayList (senza dover fare cast).
Quando uso Collection io preferisco sempre la prima dicitura (ma è una cosa personale)