Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46

    Problema hashmap e interfaccia

    Ciao a tutti.
    Ho un interfaccia Interface contenente un metodo e una classe InterfaceImpl che la implementa contenente l'implementazione del metodo e in più ho definito un campo intero da associare a un oggetto di quel tipo.
    Prima domanda: posso definire un campo nella classe di implementazione dell'interfaccia(InterfaceImpl) nonostante l'interfaccia non ne possa contenere?
    Altro problema: nella classe principale Esercizio ho dei metodi i cui parametri in ingresso hanno come tipo il nome dell'interfaccia(Ad esempio Interface x). Se in questi metodi volessi creare un oggetto di tipo Interface, poichè questi oggetti hanno un campo intero, dovrò chiamare il costruttore di InterfaceImpl passandogli l'intero, giusto? Quindi se il mio metodo accetta Interface x, se io volessi accede al campo intero dovrei fare un cast di questo tipo? -> InterfaceImpl xx = (InterfaceImpl) x
    In questo modo però il programma mi da problemi nel momento in cui vado a confrontare oggetti di tipo Interface e InterfaceImpl.
    Sto sbagliando qualcosa?
    PS: l'hashmap del titolo non centra molto, o meglio è un secondo problema, ma prima vorrei risolvere questo
    Ultima modifica di Giuso; 23-03-2018 a 17:45

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Giuso Visualizza il messaggio
    Prima domanda: posso definire un campo nella classe di implementazione dell'interfaccia(InterfaceImpl) nonostante l'interfaccia non ne possa contenere?
    Certo che puoi mettere campi (di istanza, di classe) all'interno della classe. Le interfacce non c'entrano in questo. Le interfacce servono per rappresentare a livello più astratto le operazioni che un oggetto deve poter fare (senza indicare però come) .. non quali dati deve contenere l'oggetto!

    Quote Originariamente inviata da Giuso Visualizza il messaggio
    Altro problema: nella classe principale Esercizio ho dei metodi i cui parametri in ingresso hanno come tipo il nome dell'interfaccia(Ad esempio Interface x). Se in questi metodi volessi creare un oggetto di tipo Interface, poichè questi oggetti hanno un campo intero, dovrò chiamare il costruttore di InterfaceImpl passandogli l'intero, giusto?
    Questione "forse" posta un po' male. Se un metodo ha un parametro del tipo di una interfaccia, di norma è perché al metodo non interessa "sapere" quale è la implementazione e gli basta solo operare con i metodi della interfaccia e di conseguenza "accetta" quindi qualunque sua implementazione.

    Se un metodo riceve un java.util.List (la interfaccia), allora si presume che gli vada bene ricevere una qualunque sua implementazione, ArrayList, LinkedList, CopyOnWriteArrayList, ecc..

    Quote Originariamente inviata da Giuso Visualizza il messaggio
    Quindi se il mio metodo accetta Interface x, se io volessi accede al campo intero dovrei fare un cast di questo tipo? -> InterfaceImpl xx = (InterfaceImpl) x
    No, "nì". Se fai così vai a "cablare" il metodo verso quella specifica implementazione. Andando quindi contro a quanto dicevo prima. Se un metodo riceve come parametro un tipo interfaccia, dovrebbe essere perché gli basta stare sul "generico", senza sapere quale è la implementazione.

    Quote Originariamente inviata da Giuso Visualizza il messaggio
    Sto sbagliando qualcosa?
    Probabilmente devi ancora afferrare meglio a cosa servono le interfacce e come usarle.
    Ultima modifica di andbin; 23-03-2018 a 18:21
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46
    Ok, è chiaro, però non ho capito come fare.
    Cioè entriamo più nel dettaglio. Ho un hashmap<Vertex, LinkedList<Vertex>> dove Vertex è appunto la mia interfaccia. I miei metodi accettano un Vertex v. Se io voglio verificare se il Vertex v passato come parametro è contenuto nella mia hashmap, potrei farlo con hash.containsKey(v). Il problema è che quel Vertex che passo al mio metodo sarà un vertice inserito dall'utente nel main, pertanto verrà istanziato con una new VertexImpl. Ora mi chiedo: la containsKey() funziona se i due tipi sono "diversi"? A quanto pare no. Quindi mi vien da pensare che nonostante entrambi gli oggetti abbiano il campo intero uguale, java li vede diversi, perchè?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Giuso Visualizza il messaggio
    Ho un hashmap<Vertex, LinkedList<Vertex>> dove Vertex è appunto la mia interfaccia. I miei metodi accettano un Vertex v. Se io voglio verificare se il Vertex v passato come parametro è contenuto nella mia hashmap, potrei farlo con hash.containsKey(v). Il problema è che quel Vertex che passo al mio metodo sarà un vertice inserito dall'utente nel main, pertanto verrà istanziato con una new VertexImpl. Ora mi chiedo: la containsKey() funziona se i due tipi sono "diversi"? A quanto pare no. Quindi mi vien da pensare che nonostante entrambi gli oggetti abbiano il campo intero uguale, java li vede diversi, perchè?
    Chiariamo una cosa: il containsKey(Object) delle mappe si basa sul metodo equals(Object) degli oggetti.

    Ora, dimentica per una attimo le interfacce. Nel metodo equals di norma si fa innanzitutto un test con l'operatore instanceof (che testa la relazione detta IS-A, "è-un") e talvolta invece di instanceof si fa un test più "stretto" direttamente sul Class dell'oggetto.
    In sostanza di norma si fa in modo che classi scorrelate (non in relazione tra di loro) NON siano comparabili per uguaglianza. Un String non può essere uguale ad altro, un Integer non può essere uguale ad un Long, ecc...

    Le interfacce NON c'entrano in questo. Se hai una interfaccia Vertex ed avessi ipoteticamente 2 implementazioni VertexImpl1 e VertexImpl2, è presumibile e ragionevole fare in modo che il equals di VertexImpl1 si aspetti di ricevere SOLO oggetti VertexImpl1 (e nient'altro) e in maniera similare il equals di VertexImpl2 si aspetti di ricevere SOLO oggetti VertexImpl2.

    Questo perlomeno è ciò che si fa di norma. Tanto per esempio: String, StringBuilder e StringBuffer sono implementazioni della interfaccia CharSequence. Ma un oggetto String NON è mai "uguale" ad un StringBuilder o StringBuffer .. nemmeno se rappresentano la stessa sequenza di caratteri.

    Quindi come vedi il punto NON è la interfaccia ma la scelta all'interno di ciascuna classe riguardo la implementazione di equals().

    Pertanto, se tu del tuo Vertex hai una sola implementazione (VertexImpl), allora non importa chi/dove istanzia i VertexImpl. Se il suo equals() è corretto/appropriato allora due oggetti VertexImpl DISTINTI, possono essere "uguali" se hanno lo stesso significato secondo la implementazione di equals.

    E nota: visto che i Vertex sono usati come "chiavi" in HashMap, allora DEVE essere implementato anche il hashCode() adeguatamente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46
    Quindi per fare in modo che la contains funzioni su ciò che creo, devo implementare un metodo override per la equals? Sei stato molto chiaro, ma dal punto di vista pratico non ho ben chiaro cosa devo fare.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Giuso Visualizza il messaggio
    Quindi per fare in modo che la contains funzioni su ciò che creo, devo implementare un metodo override per la equals? Sei stato molto chiaro, ma dal punto di vista pratico non ho ben chiaro cosa devo fare.
    Quindi non hai ancora implementato equals/hashCode in VertexImpl?? Allora corri subito ad implementarli!
    Perché altrimenti i tuoi vertex non ti funzioneranno mai come "chiavi" in HashMap.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46
    Eh no ahahah
    Provo questa sera, se ho bisogno torno qui, grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46
    Ok risolto.
    Ho un altro problema. Un metodo accetta come parametro Collection<? exyends mioTipo> nome)
    E io devo passargli semplicemente una collezione di oggetti di tipo mioTipo. Ho provato a passargli una LinkedList<mioTipo> ma mi da errore quando richiamo quel metodo. Come posso risolvere?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Giuso Visualizza il messaggio
    Ho un altro problema. Un metodo accetta come parametro Collection<? exyends mioTipo> nome)
    E io devo passargli semplicemente una collezione di oggetti di tipo mioTipo. Ho provato a passargli una LinkedList<mioTipo> ma mi da errore quando richiamo quel metodo. Come posso risolvere?
    Ma è corretto, lecito.
    Se un metodo ha un parametro di tipo Collection<? extends Xyz>, tu PUOI passargli un LinkedList<Xyz>

    (Xyz quello che vuoi)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2018
    Messaggi
    46
    Devo fare un cast all'inizio del metodo? Cioè non posso fare lista.get, dove lista è la Collection passata come parametro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.