Istanza di un'interfaccia

di il
8 risposte

Istanza di un'interfaccia

Studiando i generics e di conseguenza il framework Collection di Java sono incappato in questa scrittura :

List<Tipo> lista = new ArrayList<>;

Dove List è un'interfaccia, quello che mi chiedo è cosa sia possibile fare con la reference lista e a cosa questa punti.

So di per certo che tramite lista posso accedere solamente ai metodi dell'interfaccia List opportunamente ridefiniti nella classe ArrayList (giusto?)

Quello che mi chiedo è a cosa punta lista, l'idea che mi sono fatto è che lista punta ad un oggetto di tipo ArrayList in memoria ma con intervallo di puntamento pari a List, cioè quello dell'interfaccia. Mi sbaglio?

8 Risposte

  • Re: Istanza di un'interfaccia

    Ristudiati che cosa e' un'interfaccia!

    'lista' punta ad un oggetto di classe ArrayList

    Il compilatore ti permette di utilizzare SOLO i metodi dell'interfaccia 'List'
  • Re: Istanza di un'interfaccia

    pterodattero ha scritto:


    List<Tipo> lista = new ArrayList<>;
    Innanzitutto ci vogliono le parentesi tonde per il costruttore:

    List<Tipo> lista = new ArrayList<>();

    Il "diamond" (quel <> ) è semplicemente una abbreviazione sintattica disponibile da Java 7 che sfrutta maggiormente l'inferenza dei tipi. Quindi è di fatto uguale al "vecchio" modo:

    List<Tipo> lista = new ArrayList<Tipo>();

    pterodattero ha scritto:


    Dove List è un'interfaccia, quello che mi chiedo è cosa sia possibile fare con la reference lista e a cosa questa punti.
    La parte a destra del = è la istanziazione di un ArrayList, quindi viene creato un oggetto ArrayList. E la variabile quindi farà riferimento a quell'oggetto.

    pterodattero ha scritto:


    So di per certo che tramite lista posso accedere solamente ai metodi dell'interfaccia List opportunamente ridefiniti nella classe ArrayList (giusto?)
    Semplicemente la variabile invece di essere del tipo ArrayList è del tipo List, che è lecito, dato che ArrayList "è-un" (relazione IS-A) List, poiché appunto implementa List ed è quindi un sottotipo specifico di List.

    E' come se la variabile "vedesse" l'oggetto con degli "occhiali" più piccoli che permettono di vedere solo ciò che List mette a disposizione.
    ArrayList ha di specifico il metodo trimToSize(), che List NON ha. Quindi su quella variabile lista non puoi invocare trimToSize(). Il metodo c'è, esiste nell'oggetto. Ma attraverso un reference di tipo List semplicemente non lo "vedi".

    Java funziona così, è un linguaggio tipizzato staticamente, non è un linguaggio "dinamico".
  • Re: Istanza di un'interfaccia

    andbin ha scritto:


    pterodattero ha scritto:


    List<Tipo> lista = new ArrayList<>;
    Innanzitutto ci vogliono le parentesi tonde per il costruttore:

    List<Tipo> lista = new ArrayList<>();

    Il "diamond" (quel <> ) è semplicemente una abbreviazione sintattica disponibile da Java 7 che sfrutta maggiormente l'inferenza dei tipi. Quindi è di fatto uguale al "vecchio" modo:

    List<Tipo> lista = new ArrayList<Tipo>();

    pterodattero ha scritto:


    Dove List è un'interfaccia, quello che mi chiedo è cosa sia possibile fare con la reference lista e a cosa questa punti.
    La parte a destra del = è la istanziazione di un ArrayList, quindi viene creato un oggetto ArrayList. E la variabile quindi farà riferimento a quell'oggetto.

    pterodattero ha scritto:


    So di per certo che tramite lista posso accedere solamente ai metodi dell'interfaccia List opportunamente ridefiniti nella classe ArrayList (giusto?)
    Semplicemente la variabile invece di essere del tipo ArrayList è del tipo List, che è lecito, dato che ArrayList "è-un" (relazione IS-A) List, poiché appunto implementa List ed è quindi un sottotipo specifico di List.

    E' come se la variabile "vedesse" l'oggetto con degli "occhiali" più piccoli che permettono di vedere solo ciò che List mette a disposizione.
    ArrayList ha di specifico il metodo trimToSize(), che List NON ha. Quindi su quella variabile lista non puoi invocare trimToSize(). Il metodo c'è, esiste nell'oggetto. Ma attraverso un reference di tipo List semplicemente non lo "vedi".

    Java funziona così, è un linguaggio tipizzato staticamente, non è un linguaggio "dinamico".
    Grazie per la risposta esauriente, molto gentile.
  • Re: Istanza di un'interfaccia

    migliorabile ha scritto:


    Ristudiati che cosa e' un'interfaccia!

    'lista' punta ad un oggetto di classe ArrayList

    Il compilatore ti permette di utilizzare SOLO i metodi dell'interfaccia 'List'
    ma con intervallo di puntamento pari a List, cioè quello dell'interfaccia
    Questa frase, che cosa vorrebbe dire?
    Messa cosi' e' solo una sequenza di parole italiane senza senso
    Grazie per la risposta.
    EDIT: nei testi che ho consultato non è riportato alcun legame tra la definizione di interfaccia e il frammento (scorretto per altro) di codice da me riportato, se può magari indicarmi qualche fonte più completa da cui studiare ne sarei grato.

    La frase che è "una sequenza di parole italiane senza senso" intendeva al fatto che lista come reference ha come "intervallo di puntamento" ( termine trovato sul testo da me in uso) quello di di List e non di ArrayList.
    Spero di essermi espresso bene, in caso contrario la prego ancora di dirmi dove sono caduto in errore. Grazie in anticipo per l'eventuale risposta!
  • Re: Istanza di un'interfaccia

    pterodattero ha scritto:


    EDIT: nei testi che ho consultato non è riportato alcun legame tra la definizione di interfaccia e il frammento (scorretto per altro) di codice da me riportato, se può magari indicarmi qualche fonte più completa da cui studiare ne sarei grato.
    Quali sono esattamente i tuoi dubbi sulle interfacce? Li hai chiari i concetti di "ereditarietà" e "polimorfismo" in Java?
  • Re: Istanza di un'interfaccia

    andbin ha scritto:


    pterodattero ha scritto:


    EDIT: nei testi che ho consultato non è riportato alcun legame tra la definizione di interfaccia e il frammento (scorretto per altro) di codice da me riportato, se può magari indicarmi qualche fonte più completa da cui studiare ne sarei grato.
    Quali sono esattamente i tuoi dubbi sulle interfacce? Li hai chiari i concetti di "ereditarietà" e "polimorfismo" in Java?
    Non ho veri e propri dubbi sulle interfacce bensì mi ha lasciato spiazzato il pezzo di codice che ho riportato nella domanda.
    Se può consigliare dei manuali che espongono gli argomenti in toto e non lasciano "pezzi" in giro per poi riprenderli più tardi sarebbe ottimo.
    La ringrazio in anticipo!
  • Re: Istanza di un'interfaccia

    pterodattero ha scritto:


    Non ho veri e propri dubbi sulle interfacce bensì mi ha lasciato spiazzato il pezzo di codice che ho riportato nella domanda.
    Ma la questione non sono tanto le interfacce ma in generale i concetti di ereditarietà/polimorfismo.

    In Java un tipo (reference, non certo primitivo) può derivare da un altro tipo. Se il tipo B estende il tipo A, allora ovunque sia richiesto un oggetto di tipo A tu puoi anche lecitamente passare/assegnare un oggetto di tipo B.
    Se la classe Gatto estende Animale, allora ovunque ci sia una variabile/parametro di tipo Animale, tu puoi passarci un oggetto di tipo Gatto.

    Questo principio della ereditarietà vale per le classi ma anche per le interfacce. Con le regole per cui:
    - una interfaccia può estendere N altre interfacce
    - una classe può estendere 1 sola altra classe e implementare N interfacce.

    Se ho una definizione del tipo:

    public class B extends A implements X, Y { ...... }

    Allora la classe A e le interfacce X e Y sono "super tipi" di B.

    Nel caso delle collezioni: ArrayList implementa la interfaccia List. List estende la interfaccia Collection e Collection estende la interfaccia Iterable. Quindi List/Collection/Iterable sono "super tipi" di ArrayList. E ne consegue che TUTTE le seguenti assegnazioni sono lecite e tecnicamente corrette.

    List<UnTipo> x = new ArrayList<UnTipo>();

    Collection<UnTipo> x = new ArrayList<UnTipo>();

    Iterable<UnTipo> x = new ArrayList<UnTipo>();

    Se non ti sono chiari questi aspetti, non è tanto un problema delle "collezioni" ma appunto in generale dei principi fondamentali della programmazione ad oggetti.

    pterodattero ha scritto:


    Se può consigliare dei manuali che espongono gli argomenti in toto e non lasciano "pezzi" in giro per poi riprenderli più tardi sarebbe ottimo.
    Qualunque libro serio/valido che sia introduttivo alla programmazione in Java dovrebbe spiegare questi concetti.
    Non li ho personalmente ma sui forum di programmazione vengono spesso citati e ben quotati i libri su Java di Claudio De Sio Cesari. Se ti va bene l'italiano. Se gradisci libri in inglese .... ce ne sono una svagonata in più ...
  • Re: Istanza di un'interfaccia

    andbin ha scritto:


    pterodattero ha scritto:


    Non ho veri e propri dubbi sulle interfacce bensì mi ha lasciato spiazzato il pezzo di codice che ho riportato nella domanda.
    Ma la questione non sono tanto le interfacce ma in generale i concetti di ereditarietà/polimorfismo.

    In Java un tipo (reference, non certo primitivo) può derivare da un altro tipo. Se il tipo B estende il tipo A, allora ovunque sia richiesto un oggetto di tipo A tu puoi anche lecitamente passare/assegnare un oggetto di tipo B.
    Se la classe Gatto estende Animale, allora ovunque ci sia una variabile/parametro di tipo Animale, tu puoi passarci un oggetto di tipo Gatto.

    Questo principio della ereditarietà vale per le classi ma anche per le interfacce. Con le regole per cui:
    - una interfaccia può estendere N altre interfacce
    - una classe può estendere 1 sola altra classe e implementare N interfacce.

    Se ho una definizione del tipo:

    public class B extends A implements X, Y { ...... }

    Allora la classe A e le interfacce X e Y sono "super tipi" di B.

    Nel caso delle collezioni: ArrayList implementa la interfaccia List. List estende la interfaccia Collection e Collection estende la interfaccia Iterable. Quindi List/Collection/Iterable sono "super tipi" di ArrayList. E ne consegue che TUTTE le seguenti assegnazioni sono lecite e tecnicamente corrette.

    List<UnTipo> x = new ArrayList<UnTipo>();

    Collection<UnTipo> x = new ArrayList<UnTipo>();

    Iterable<UnTipo> x = new ArrayList<UnTipo>();

    Se non ti sono chiari questi aspetti, non è tanto un problema delle "collezioni" ma appunto in generale dei principi fondamentali della programmazione ad oggetti.

    pterodattero ha scritto:


    Se può consigliare dei manuali che espongono gli argomenti in toto e non lasciano "pezzi" in giro per poi riprenderli più tardi sarebbe ottimo.
    Qualunque libro serio/valido che sia introduttivo alla programmazione in Java dovrebbe spiegare questi concetti.
    Non li ho personalmente ma sui forum di programmazione vengono spesso citati e ben quotati i libri su Java di Claudio De Sio Cesari. Se ti va bene l'italiano. Se gradisci libri in inglese .... ce ne sono una svagonata in più ...
    Grazie per la risposta, adesso mi è molto più chiaro, continuo a studiare sperando di non bloccarmi più!
Devi accedere o registrarti per scrivere nel forum
8 risposte