Risoluzione Conflitti fra Metodi di Default (Interfacce)

di il
2 risposte

Risoluzione Conflitti fra Metodi di Default (Interfacce)

La mia domanda è: dato il codice seguente, posso dire che viene creato un nuovo metodo getId, nella classe Empolyee, per risolvere il conflitto? Se si, perché non posso dire che si ha un'override? Perché il metodo appartiene ad una interfaccia?
public interface Person {
...
default int getId(){ return 0; }

}
public interface Identified{
...
default int getId(){return Math.abs(hashCode()); }

}
public class Employee implements Person, Identified{

public int getId(){ return Identified.super.getId(); }

}
grazie per l'attenzione.

p.s.: Aspettatemi per altre domande

2 Risposte

  • Re: Risoluzione Conflitti fra Metodi di Default (Interfacce)

    ^Matteo^ ha scritto:


    posso dire che viene creato un nuovo metodo getId, nella classe Empolyee, per risolvere il conflitto? Se si, perché non posso dire che si ha un'override? Perché il metodo appartiene ad una interfaccia?
    Innanzitutto la definizione di getId() in Employee È un override. Per il compilatore, il implements Person, Identified è un conflitto perché entrambe le interfacce hanno lo stesso metodo di default. E nessuna delle due interfacce è più "specifica" dell'altra. Quindi già solo questo dà conflitto (anche se non usassi/invocassi mai il getId() ).
    E pertanto il conflitto va risolto e per farlo si DEVE ridefinire il metodo. Poi all'interno del metodo puoi fare quello che vuoi, anche qualcosa di radicalmente differente dalle due interfacce.
    Ma se l'obiettivo è solo scegliere uno dei due default, allora la forma nomeinterfaccia.super.metodo() è quella che serve.
  • Re: Risoluzione Conflitti fra Metodi di Default (Interfacce)

    Molte grazie, sempre gentilissimo.
Devi accedere o registrarti per scrivere nel forum
2 risposte