Ich arbeitete an Switch-Fall.Java 8: Unterschied zwischen class.getName() und String-Literal
Wenn wir verwenden class.getName(), dann erhalte ich Fehler, dass „Fall Ausdrücke konstanter Ausdrücke sein muss“ wie folgt:
switch(param.getClass().getName())
{
case String.class.getName():
// to do
break;
}
Auch wenn wir folgende, string Klassennamen in einem nehmen konstant, dann auch, immer gleichen Fehler:
public static final String PARAM_NAME = String.class.getName();
switch(param.getClass().getName())
{
case PARAM_NAME:
// to do
break;
}
Aber, wenn ich folgende, die Stringliteral "java.lang.String" verwenden, gibt es nicht Fehler:
public static final String PARAM_NAME = "java.lang.String";
Kann jemand bitte erklären, warum es nicht die ersten zwei Fälle nimmt und die letzte nimmt? Danke im Voraus.
Aber ich nehme das in "statischen finalen" (dh, konstanten) Variablen, dann auch, es nicht zu nehmen? –
der Compiler macht etwas Magie und ich nehme an, die beiden ersten Dinge sind in den gleichen Byte-Code kompilieren. Das letzte, das du gibst, dort wird das String-Literal verwendet und daher funktioniert es –
@KrishnaKumar Ein 'static final'-Feld ist nicht unbedingt eine Kompilierzeitkonstante, auch wenn es für praktische Zwecke eine Konstante zur Laufzeit ist. – chrylis