1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Anfängerprobleme Klassenreferenz

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Neudroid, 09.09.2010.

  1. Neudroid, 09.09.2010 #1
    Neudroid

    Neudroid Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    08.09.2010
    Hallo zusammen,
    ich versuche mich gerade in die Android-Programmierung 'einzulesen' und habe da mal eine Frage.

    Ich durchschaue einen solchen Ausdruck nicht:

    MyApp appState = ((MyApp)getApplicationContext());

    MyApp ist meine Applikations-Klasse und appState eine Variable vom Typ
    MyApp die mit diesem Ausdruck erstellt werden soll . Was bedeutet aber das die rechte Seite in Klammern steht und das geklammerte (MyApp) auf der rechten Seite. Ich finde einfach nirgendwo eine Erklärung da man nach "(" auch schlecht suchen kann ;-) Ich würde annehmen (MyApp) soll bewirken daß ein Typ MyApp erzwungen wird damit der Compiler keinen Fehler meldet. Wie bei (int) (2/3) ???

    Vielleicht kann mich jemand aufklären

    Danke neudroid
     
    Zuletzt bearbeitet: 09.09.2010
  2. DieGoldeneMitte, 09.09.2010 #2
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    "(Typname)" ist ist ein "Casting Operator", der das Objekt hinter dem Operator in ein Objekt des Typs Typname umwandelt. Das geht natürlich (bzw im Gegensatz zu Sprachen wie C) nur dann, wenn das Objekt wirklich diesen Typ hat. Wenn nicht wird eine ClassCastException ausgelöst.

    Wieso muss man hier casten? Das hattest du so ungefähr schon richtig: getApplicationContext() liefert in einer Activity ein Objekt vom Typ Context, und zwar die aktuelle Activity. Wenn man nun mit seiner Activity etwas machen will, will man da meist eigene Funktionen aufrufen. Da der Compiler da ein Context Objekt sieht, und nicht ein MyApp, wird er das nicht kompilieren. Der Cast sagt dem Compiler, dass er das Contextobjekt nun als MyApp Objekt auffassen soll. Wichtig: da wird nichts "umgewandelt". Wenn das Objekt NICHT MyApp ist, gibts zur Laufzeit eine Exception.

    Die Klammern um den Gesamtausdruck sind in diesem konkreten Fall überflüssig. Man braucht sie aber, wenn man in einem komplexeren Ausdruck mit dem gecasteten Objekt etwas machen will. Zum Beispiel:
    Code:
    ((MyApp)getApplicationContext()).methode()
    Ohne die äußeren Klammern wäre nicht klar, ob das Ergebnis von getAppContext() oder das von methode() gecastet werden soll.
     
    Zuletzt bearbeitet: 09.09.2010
    Neudroid bedankt sich.
  3. Neudroid, 09.09.2010 #3
    Neudroid

    Neudroid Threadstarter Neuer Benutzer

    Beiträge:
    3
    Erhaltene Danke:
    0
    Registriert seit:
    08.09.2010
    Danke für die ausführliche Antwort :)
     

Diese Seite empfehlen