Stavo lavorando su switch case.java 8: differenza tra class.getName() e String letterale
Se usiamo class.getName(), poi, sto ottenendo errore che "espressioni case devono essere espressioni costanti" come segue:
switch(param.getClass().getName())
{
case String.class.getName():
// to do
break;
}
Anche se facciamo seguire, prendere stringa di nome di classe in un costante, allora anche, ottenendo lo stesso errore:
public static final String PARAM_NAME = String.class.getName();
switch(param.getClass().getName())
{
case PARAM_NAME:
// to do
break;
}
Ma, se io in seguito, utilizzare la stringa letterale "java.lang.String", non c'è errore:
public static final String PARAM_NAME = "java.lang.String";
Qualcuno può spiegare questo, perché non sta prendendo i primi due casi e sta prendendo l'ultimo? Grazie in anticipo.
Ma, lo sto prendendo anche nella variabile 'statico finale' (cioè costante), quindi anche non lo sta prendendo? –
il compilatore fa un po 'di magia e presumo che le prime due cose siano compilate nello stesso identico codice byte. L'ultimo dato, lì viene usato il letterale String e quindi funziona –
@KrishnaKumar Un campo 'static final' non è necessariamente una costante in fase di compilazione, anche se per scopi pratici è una costante in fase di runtime. – chrylis