Perché non è toString () sempre invocato automaticamente
-
11-10-2019 - |
Domanda
Quindi, perché non è toString sempre invocato? Questo è un esempio utilizzando l'API di Android.
es
@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
int position, long id) {
Toast.makeText(this, adapterView, Toast.LENGTH_LONG).show();
}
non verrà compilato. Tuttavia, se lo cambio a
@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
int position, long id) {
Toast.makeText(this, adapterView.toString(), Toast.LENGTH_LONG).show();
}
Sarà. Qual è la differenza reale?
Soluzione
Che cosa si intende per sempre? toString()
è solo un metodo che restituisce una rappresentazione String
dell'oggetto. Il Toast.makeText
si aspetta un parametro String
, ma nel primo caso vi darà un oggetto della classe AdapterView
. Così non si compila:)
Altri suggerimenti
adapterView
non è un String
.
toString()
non viene richiamato automaticamente dal compilatore per eseguire un cast - che metterebbe a repentaglio la sicurezza di tipo un po '. Solo quando c'è un +""
per esempio, il compilatore chiamerà toString () in modo automatico.
L'unica situazione in cui toString () è inserito dal compilatore è in concatenazione stringa.
Inoltre, questo
@Override
public void onItemSelected(AdapterView<?> adapterView, View view,
int position, long id) {
Toast.makeText(this, "" + adapterView, Toast.LENGTH_LONG).show();
}
compilerà;)
Non so l'API di Android, ma AdapterView non è in realtà una sottoclasse di CharSequence quindi bisogna applicare toString ().
suppongo secondo parametro di Toast.makeTest è di tipo String. Poi cercando di passare un parametro di tipo AdapterView non funzionerà. toString () non viene mai chiamato automaticamente, tranne quando concatenazione di stringhe ( "" + adapterView funzionerebbe pure, ma è più brutto).
Il compilatore decide quale metodo è richiesto dal nome del metodo e il numero e il tipo di ogni argomento fornito. Nel tuo primo esempio, cerca un metodo chiamato makeText che ha un AdapterView come secondo parametro e reperti nessuno (il vostro errore di compilazione avrebbe te l'ha detto. Nel vostro secondo esempio il secondo parametro è una stringa e il compilatore trova il corrispondente metodo. Si noti che il compilatore non riesce a trovare il metodo prima, poi fare i parametri in forma, altrimenti non abbiamo potuto avere metodi di overload.