Problema interfacce

di il
5 risposte

Problema interfacce

Ciao, ho un dubbio sulle interfacce. Se io ho un interfaccia X e una classe in cui voglio usare un oggetto di tipo X, devo prima di tutto implementare l'interfaccia X con implements(con la classe ad esempio Ximpl), giusto?
A questo punto, se nella mia classe voglio creare un nuovo oggetto, posso fare new X() o devo fare new Ximpl()? (IO PENSAVO Ximpl)
Altra domanda. Se nella class principale ho dei metodi che ricevono in ingresso dei tipi X, se io volessi accedere ai campi di X definiti in Ximpl, come posso fare?
Credo siano banalità, ma ho un po' di dubbi....

5 Risposte

  • Re: Problema interfacce

    Giuso ha scritto:


    Se io ho un interfaccia X e una classe in cui voglio usare un oggetto di tipo X, devo prima di tutto implementare l'interfaccia X con implements(con la classe ad esempio Ximpl), giusto?
    La domanda è un po' "dubbia". Cosa intendi per "usare"?
    Una interfaccia X si implementa in una classe ( class Xyz implements X ) SE ha senso implementarla ... non solo perché vuoi "usare" X.

    Giuso ha scritto:


    A questo punto, se nella mia classe voglio creare un nuovo oggetto, posso fare new X() o devo fare new Ximpl()? (IO PENSAVO Ximpl)
    NON puoi fare new X() se X è una interfaccia. Le interfacce non si possono istanziare.

    Giuso ha scritto:


    Se nella class principale ho dei metodi che ricevono in ingresso dei tipi X, se io volessi accedere ai campi di X definiti in Ximpl, come posso fare?
    Le interfacce non hanno variabili di istanza (come le classi). Al massimo hanno delle costanti. Quindi no, avendo solo il riferimento ad una interfaccia X, non puoi accedere a delle variabili di istanza.
  • Re: Problema interfacce

    Ok, ho abbastanza capito.
    Un'altra domanda. Se la mia classe implementa Iterable<>, l'implementazione della sua interfaccia la devo fare come sottoclasse della classe che la implementa? Quindi potrei implementarla direttamente all'interno della mi classe?
  • Re: Problema interfacce

    Giuso ha scritto:


    Un'altra domanda. Se la mia classe implementa Iterable<>, l'implementazione della sua interfaccia la devo fare come sottoclasse della classe che la implementa? Quindi potrei implementarla direttamente all'interno della mi classe?
    Se una tua classe Xyz dichiara di implementare Iterable<Qualcosa>, allora nella tua classe devi implementare il metodo iterator() per far restituire un Iterator<Qualcosa>.
  • Re: Problema interfacce

    Ok.
    Ho un problema con l'hashmap. In pratica ho definito un hashmap in cui la chiave è un oggetto il cui tipo è il nome di un interfaccia e i valori sono delle LinkedList di oggetti dello stesso tipo della chiave. Quindi ho la classe che mi implementa l'interfaccia. Quando aggiungo un nuovo chiave, valore all'hash map, faccio la new di un oggetto il cui tipo è il nome dell'implementazione dell'interfaccia. Se però quando voglio aggiungere un elemento ne inserisco uno già presente, cioè la chiave esiste già, nonostante io faccia hash.containskey(oggetto) anche se l'oggetto è già presente mi inserisce l'oggetto, come se fosse diverso. Perchè succede questo? la contains se non sbaglio applica la o.equals(o2), quindi se ho un object.info = 2 e faccio la new di un object2.info = 2 la contains dovrebbe restituire true, cioè l'elemento è già una chiave della hash
  • Re: Problema interfacce

    Nel 99% dei casi il motivo per cui puoi inserire più volte la stessa chiave in una mappa è che nella tua implementazione dell'oggetto che usi come chiave non hai ridefinito i metodi "hashCode" e "equals". Questi 2 metodi, infatti, sono fondamentali per fare in modo che un oggetto possa essere usato come chiave di una HashMap. In particolare è fondamentale che:
    • il metodo "equals" restituisca true per oggetti uguali, e false per oggetti diversi
    • il metodo "hashCode" restituisca lo stesso valore per oggetti uguali (e possibilmente valori diversi per oggetti diversi, ma non è strettamente necessario)
    Ovviamente se tu non ridefinisci tali metodi, la tua classe eredita l'implementazione di "Object", che rispetta questi vincoli solo se li applichi a 2 riferimenti diversi del medesimo oggetto
Devi accedere o registrarti per scrivere nel forum
5 risposte