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 ++?
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 ++?
Risposte:
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?
float
, lo è double
.
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.
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.
calculateAnswer(double, int, double, double)
". Verifica che il tipo restituito non sia incluso, @konmik.
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.
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");
}
}
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.
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.
no non è realmente possibile in questo modo puoi solo sovraccaricare il numero di argomenti o il tipo di dati degli argomenti