2015-05-25 7 views
10

Ich schreibe eine Android App und war einfach neugierig, warum wir immer Android tippen müssen. Ich verstehe, dass wir uns des Typs sicher sein müssen, damit unser Code richtig läuft, aber gibt es vielleicht noch einen anderen Grund?Warum geben wir immer Cast in Android/Java ein?

Beispiel:

public class Navigation extends Activity { 
    private DrawerLayout mDrawerLayout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // other irrelevant code 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 

Im Zusammenhang mit dieser Frage, ich frage, warum wir müssen den Rückgabewert der findViewById geben Guss. (Ich bin auch neugierig, wie diese Art Casting getan wird, wenn man das erklären könnte.)

Antwort

10

findViewById lädt Ressourcen aus einer Datei. Es gibt eine Art von View zurück, aber der Java-Compiler kann nicht wissen, dass es ein DrawerLayout (weil es in einer Datei außerhalb der Java-Kompilierung definiert ist) sein wird.

Wenn Sie in Ihrem Code eine DrawerLayout benötigen, müssen Sie sie umsetzen. Das stellt sicher (zur Laufzeit), dass es wirklich ein solches Objekt ist (wenn nicht, erhalten Sie eine ClassCastException und Ihr Programm wird an diesem Punkt abbrechen).

Der Grund für die Umwandlung in DrawerLayout ist, dass Sie Methoden für die Instanz aufrufen möchten, die in dieser Klasse definiert sind. Manchmal mag es Ihnen nur mit der Unterschrift der allgemeineren Oberklasse gut gehen. Dann musst du es nicht werfen.

Um sicher zu sein, ist die von findViewById zurückgegebene Instanz ein DrawerLayout egal, ob Sie es umwandeln oder nicht. Aber wenn Sie es nicht umsetzen, wird Java Sie nicht als DrawerLayout behandeln lassen. Das ist der Sinn einer typsicheren Sprache: Wenn der Compiler nicht sicher sein kann, dass ein Objekt einer bestimmten Klasse angehört, können Sie Methoden (oder Zugriffsfelder) für diese Klasse nicht aufrufen.

1

DrawerLayout ist eine Unterklasse von View. Ein DrawerLayout Objekt hat automatisch alle Methoden, die eine View hat, definiert aber einige eigene Methoden, die spezifisch für DrawerLayout sind. Wenn Sie es nicht umwandeln, können Sie keine dieser Methoden verwenden: DrawerLayout; Sie können nur die Methoden verwenden, die für alle View s definiert sind.

Der Typ-Casting tut wirklich nichts. findViewById wird deklariert, um eine View zurückzugeben, da es alle verschiedenen Arten von View s zurückgeben kann. Aber in Wirklichkeit wird oft ein Objekt einer anderen Klasse zurückgegeben, das ist eine Unterklasse von View. Die Typumwandlung prüft nur, ob das zurückgegebene Objekt wirklich eine Instanz von DrawerLayout (oder einer seiner Unterklassen) ist. Wenn nicht, wird eine Ausnahme ausgelöst, aber wenn dies der Fall ist, können Sie das Objekt nun als DrawerLayout betrachten und die Methoden DrawerLayout verwenden.

+0

Oh typisieren müssen, so ist es mit der Art gegossen wie eine Verlängerung ist? – wkcamp

+0

Sorry, ich verstehe die Frage nicht. – ajb

+0

Ich habe nur bestätigt, was Sie gesagt haben: "Objekt hat automatisch alle Methoden, die eine View hat, definiert aber einige eigene Methoden, die spezifisch für DrawerLayouts sind", also erhält das Objekt beim Casting alle Methoden von DrawerLayouts statt nur der View-Klasse. – wkcamp

-1

In Android - beim Schreiben von Java-Code müssen Sie XML-Code in Java bringen.

So verwenden wir R.id.drawer_layout ist, was wir in Java bringen möchten, die findViewById(R.id.drawer_layout) wird, die eine Object zurückgibt.

Also weisen wir es dann einer oben deklarierten Variablen zu.

private DrawerLayout mDrawerLayout; 

wo DrawerLayout ist eine Klasse in Java Android.

mDrawerLayout = findViewById(R.id.drawer_layout); 

Da findViewById(R.id.drawer_layout) gibt ein Objekt zurück, und wir zuweisen es zu einer Variable, die wir durch die Verwendung

mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); 
+0

Ich empfehle, dass Sie Ihre Antwort mit dem eingerückten Code formatieren, um als Code angezeigt zu werden. Es würde die Antwort leichter lesbar machen. – Aaron

+0

Dies erklärt nicht, warum Sie es werfen müssen; oder zumindest, "Da ... ein Objekt zurückgibt und ... es einer Variablen zuweist", ist keine Erklärung dafür, warum Sie es tun müssen. – Schollii

Verwandte Themen