Ich bin ein Java-Neuling und vor kurzem habe ich in einige Überlegungen über den folgenden Android
Beispielcode:Analyse Casting
TextView txt = (TextView) findViewById(R.id.activity_display_message);
TextView
ein Kind View
Klasse. Und findViewById
gibt ein View
Objekt zurück.
Ich wollte verstehen, wie und warum müssen wir explizit die zurückgegebene View
zu TextView
, wenn das zurückgegebene Objekt tatsächlich ein TextView
sein muss, sonst wird das Casting wirft eine Ausnahme werfen.
Also, das ist mein Versuch zu simulieren, was mit diesem Mockup Code hinter den Kulissen vor sich geht:
class View{}
class TextView extends View{}
public class A{
// simple hard coded check of the ID
public static View findViewById(int id){
if (id == 1){
return new View();
}
else{
return new TextView();
//return ((View)new TextView()); // This also works
}
}
public static void main(String[] args){
TextView txt = (TextView)findViewById(2); // Works fine
//TextView txt2 = findViewById(2); INCOMPATIBLE TYPES ERROR because the returned type is View
View v = findViewById(2); // Works fine
View view = new View();
//TextView test = (TextView) view; // cast error
View view2 = new TextView();
TextView test2 = (TextView) view2; // Works OK
}
}
Fazit:
Es stellt sich heraus, dass findViewById
tatsächlich View
wirft zurückgeschickte Element. Ich nehme an, es liegt daran, dass der definierte Rückgabewert der Methode View
ist und Java das Ergebnis automatisch auf View
umsetzt.
Bitte sagen Sie mir, wenn ich es richtig mache.
Kann dies http://stackoverflow.com/questions/22805869/cast-result-findviewbyid-android-method hilft! – Raghunandan
ja du hast Recht, Java arbeitet auf diese Weise – RMachnik