Sovraccarico con diverso tipo di ritorno in Java?


104

Perché non è possibile sovraccaricare una funzione semplicemente cambiando il tipo restituito? Questo cambierà in una futura versione di Java?

A proposito, solo per riferimento, è possibile in C ++?


1
possibile duplicato del sovraccarico
KNU

KNU, ​​l'altra risposta differisce in quanto pone la domanda in termini generali, non specifici della lingua. È anche interessante che la risposta accettata da un'altra domanda va oltre, specificando che la JVM Java consente che venga eseguita con la manipolazione degli interni.
J marmotta

Risposte:


157

Non puoi farlo in Java e non puoi farlo in C ++. La logica è che il valore restituito da solo non è sufficiente per il compilatore per capire quale funzione chiamare:

public int foo() {...}
public float foo() {..}

...
foo(); // which one?

3
Ho sempre pensato che se avessimo fatto qualcosa come int i = foo () o float f = foo () avrebbe saputo quale, ma se l'istruzione fosse solo la funzione che il compilatore non avrebbe saputo. Lo so. Grazie.
nunos

7
@nunos anche se fosse float f = foo () il compilatore non sarebbe in grado di capirlo perché sia ​​un int sarebbe un input valido per un float. Confronta float f = 7; (7 è un float o int?)
NomeN

5
@NomeN Ma la tua affermazione suggerisce che func (int i) e func (float i) sarebbero indistinguibili per il compilatore - e sappiamo tutti che questo non è vero. Il vero motivo è dato da Oded (vedi risposta successiva): si tratta della firma del metodo. E, btw. 7 è decisamente intero mentre 7.0 o 7f è float ;-)
Ta Sas

7
7.0 non lo è float, lo è double.
fredoverflow

3
Il fatto che foo();senza un tipo restituito sarebbe ambiguo non è necessariamente un motivo per non consentirlo come sovraccarico. Ci sono argomenti che possono causare ambiguità (ad esempio foo(null);), ma ciò non rende il sovraccarico intrinsecamente non valido.
shmosel

48

Il motivo è che gli overload in Java sono consentiti solo per metodi con firme diverse .

Il tipo restituito non fa parte della firma del metodo, quindi non può essere utilizzato per distinguere gli overload.

Vedere Definizione dei metodi dai tutorial Java.


4
Ma perché il tipo di ritorno non fa parte della firma
andho

51
oh "solo perché"! Vedo.
andho

3
Il tipo restituito È una parte della firma del metodo. Basta esaminare lo smontaggio della classe.
konmik

2
Non è davvero @konmik, non secondo le regole del sovraccarico dei metodi. Provalo. Stesso nome metodo, stessi tipi di parametri nello stesso ordine, diversi tipi restituiti. Non verrà compilato.
Oded

3
Sì, perché il tipo restituito non fa parte della firma . La firma è: il nome del metodo + i tipi e l'ordine del suo parametro. Leggi il link che ho fornito nella mia risposta: "La firma del metodo sopra dichiarato è: calculateAnswer(double, int, double, double)". Verifica che il tipo restituito non sia incluso, @konmik.
Oded

22

Prima di Java 5.0, quando si sovrascrive un metodo, entrambi i parametri e il tipo restituito devono corrispondere esattamente. In Java 5.0, introduce una nuova funzionalità chiamata tipo di ritorno covariante. È possibile sovrascrivere un metodo con la stessa firma ma restituisce una sottoclasse dell'oggetto restituito. In altre parole, un metodo in una sottoclasse può restituire un oggetto il cui tipo è una sottoclasse del tipo restituito dal metodo con la stessa firma nella superclasse.


3
Quando l'ho visto per la prima volta sono rimasto sconcertato. Grazie per aver spiegato perché è possibile!
Dylan Knowles

2
il sovraccarico e l'override sono diversi. Il sovraccarico non implica (necessariamente) l'eredità
senseiwu

3
Questa risposta può sembrare fuorviante per un principiante in Java, perché non è affatto rilevante con il sovraccarico , è prioritario - completamente altra cosa.
azizbekian

4

Overloaded i metodi in java possono avere diversi tipi di ritorno dato che anche l'argomento è diverso.

Controlla il codice di esempio.

public class B {

    public String greet() {
        return "Hello";
    }

    //This will work
    public StringBuilder greet(String name) {
        return new StringBuilder("Hello " + name);
    }

    //This will not work
    //Error: Duplicate method greet() in type B
    public StringBuilder greet() {
        return new StringBuilder("Hello Tarzan");
    }

}

in pratica non viene preso in considerazione il tipo di ritorno, solo gli argomenti, tristi ma veri
Alexander Mills

1

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


1

Il tipo restituito non ha importanza durante il sovraccarico di un metodo. Dobbiamo solo assicurarci che non ci siano ambiguità!

L'unico modo in cui Java può sapere quale metodo chiamare è differenziando i tipi dell'elenco di argomenti. Se il compilatore consentisse due metodi con lo stesso nome e gli stessi tipi di argomenti, non ci sarebbe modo di determinare quale dovrebbe chiamare.


0

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

Se sei a conoscenza dell'esecuzione della funzione, allora sarai consapevole che quando chiamiamo una funzione viene eseguita la parte della definizione e alla fine richiediamo l'istruzione return, quindi possiamo dire che return viene dopo l'intera definizione della funzione, ecco perché se ce ne sono due o più funzioni con lo stesso nome e con lo stesso tipo e n. di argomenti quindi al momento della chiamata come il compilatore saprà quale chiamare, perché il nome della funzione ei parametri sono gli stessi. Al momento della chiamata in primo luogo tutto il focus sarà sugli argomenti e sul nome della funzione e dopo il completamento della definizione della funzione, finalmente ci occuperemo dell'istruzione return.

Compile Time Error è migliore di Run Time Error. Quindi, il compilatore java esegue il rendering dell'errore di tempo del compilatore se si dichiara che lo stesso metodo ha gli stessi parametri.


In che modo è diverso dalla risposta accettata? (Anche il motivo per cui si tratta di un errore in fase di compilazione è perché il compilatore non riesce a capire quale metodo chiamare, quindi come dovrebbe generare il codice eseguibile corretto)
UnholySheep

-2

no non è realmente possibile in questo modo puoi solo sovraccaricare il numero di argomenti o il tipo di dati degli argomenti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.