9

Diciamo che ho due interfacce interfaccia A e B: Interfacciarelativo a interfacce in Java

public interface A { 
    public int data(); 
} 

public interface B { 
    public char data(); 
} 

interfaccia A ha un metodo public int data() e l'interfaccia B ha un metodo public char data().

quando implemento entrambe le interfacce A e B in qualche classe C il compilatore mi dà un errore. È un difetto in Java? Poiché presumo che questo sia uno dei principali motivi per cui non è consentito estendere più di una classe, perché ci è consentito implementare più di un'interfaccia quando il problema persiste?

+1

Potresti pubblicare il messaggio di errore? Codice – higuaro

+0

per favore ... –

risposta

7

The Java Tutorials: Defining Methods - Overloading Methods stati,

Il linguaggio di programmazione Java supporta i metodi sovraccarico e Java può distinguere tra metodi con differenti firme dei metodi. Questo significa che i metodi all'interno di una classe possono avere lo stesso nome se hanno elenchi di parametri diversi da .

anche,

Non è possibile dichiarare più di un metodo con lo stesso nome e lo stesso numero e tipo di argomenti, perché il compilatore non può dire loro a parte.

Il compilatore non considera il tipo restituito quando si differenziano i metodi , quindi non è possibile dichiarare due metodi con la stessa firma anche se hanno un tipo di ritorno diverso.

I due metodi implementati condividono un comune metodo firma (cioè data()) e, come tale, il compilatore non può distinguere tra i due e avrà quel metodo unico soddisfa entrambi i contratti di interfaccia.


Edit:

Per esempio,

public class Foo implements IFoo, IBar{ 

    public static void main(String[] args) { 
     Foo foo = new Foo(); 
     ((IFoo) foo).print(); 
     ((IBar) foo).print(); 
    } 

    @Override 
    public void print() { 
     System.out.println("Hello, World!"); 
    } 
} 

public interface IBar { 
    void print(); 
} 

public interface IFoo { 
    void print(); 
} 

che sarà in uscita,

Hello, World! 
Hello, World! 
+0

Quindi, come fa java a trattare un metodo con la stessa firma e lo stesso tempo di ritorno in più interfacce? – chaosguru

+1

Penso che si compili correttamente :) – chaosguru

+1

se è la stessa firma, nome e stesso tipo di ritorno non c'è niente da fare, entrambe le interfacce sono soddisfatte per l'implementazione. Entrambe le interfacce sono implementate. –

2

Il problema che si presenta è nulla legati alla ereditarietà multipla. Né è l'implementazione di classe che implementa più di un'interfaccia.

Quando si definisce un'interfaccia, si sta dicendo che l'implementatore di questa interfaccia deve essere d'accordo con un contratto e implementare tutti i metodi definiti su tale interfaccia.

Un'implementazione di classe può implementare più di un'interfaccia senza problemi, ma l'interfaccia non può entrare in conflitto. In il tuo caso stai provando a implementare due interfacce che dichiarano un metodo con la stessa firma.

Una firma del metodo è composta dal nome e dal tipo di parametri in java.

Definizione: due dei componenti di una dichiarazione di metodo comprendono la firma del metodo , il nome del metodo e i tipi di parametro.

http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

Al fine di sovraccaricare un metodo che è necessario disporre di firme diverse.

L'ereditarietà multipla in Java non è consentita, in quanto vi sono problemi complessi come definire quale implementazione dovrebbe aver luogo quando il metodo è implementato da due o più super classi. Per questo argomento suggerisco di dare un'occhiata allo

In effetti, le interfacce sono utilizzate in alcune situazioni per simulare l'ereditarietà multipla, consentendo alle classi di presentare un insieme di metodi uniti.

0

Una soluzione è quella di utilizzare una classe interna:

  1. tua "classe C" implementa l'interfaccia "A"

  2. Hai anche una classe interna "D" che implementa l'interfaccia "C" :

    public class C implementa A { ... classe privata D implementa B {

Se veramente bisogno di entrambe le interfacce della stessa classe, questo potrebbe permettere di avere la botte piena e la moglie, troppo :)

+0

vuoi dire che la classe D D implementa B? – chaosguru

4

Il compilatore Java (C# anche credo) non distingue i metodi per il loro valore di ritorno . Nel tuo caso, entrambi i metodi sono considerati uguali dal compilatore nonostante la differenza nel tipo di ritorno