2012-04-09 4 views
17

Das erste Mal in Java zu entwickeln und das erste Mal für Android zu entwickeln, ist also eine ziemlich neue Frage.Wie funktioniert eine '.class'-Eigenschaft?

Im Moment habe ich diesen Code:

public void onBtnClicked(View v){ 
    /** Handles button navigation */ 

    @SuppressWarnings("rawtypes") 
    Class c; 
    int viewId = v.getId(); 

    switch (viewId) { 

    case R.id.btnNewTourny : 
     c = NewTourny.class; 
     break; 
    case R.id.btnTeamEditor : 
     c = EditTeam.class; 
     break; 
    case R.id.btnCatEditor : 
     c = EditCat.class; 
     break; 
    case R.id.btnLoadTourny : 
     c = EditCat.class; 
     break; 
    case R.id.btnNewCategory : 
     c = NewCat.class; 
     break; 
    default : 
     c = Main.class; 
    } 

    Intent myIntent = new Intent(v.getContext(), c); 
    startActivityForResult(myIntent, 0); 
} 

Kurze Frage:

Was die .class- Eigenschaft zu tun hat, zb in 'c = NewTourny.klasse'?

Warum kann ich c nicht als Tourny (die Eltern aller dieser Klassen) casten?

Lange Frage:

Diese derzeit behandelt alle Schaltfläche Navigations während meiner App und funktioniert einwandfrei. Wie Sie jedoch sehen können, habe ich eine "Rawtype" Warnung unterdrückt, die kommt, wenn ich c als Klasse caste. Nun, ich möchte wirklich einen Code ohne Warnungen, also dachte ich mir, alle diese Klassen sind ein Kind von 'Tourny', also dachte ich, es würde funktionieren, Casting wie Tourny - aber das geht nicht. Dann wurde mir klar, dass ich nicht wirklich wusste, was der Code "NewTourny.class" tatsächlich tat, und das könnte der Schlüssel dazu sein, warum ich c nicht als Tourny c bezeichnen konnte. Also, was macht .class?

Antwort

9

Es ist nicht wirklich tun viel. NewTourney.class ist mehr eine sprachspezifische Möglichkeit, "das Objekt zu schreiben, das die Klasse NewTourney ist". Diese Abkürzung erlaubt es, sich auf die -Klasse von a NewTourney zu beziehen, im Gegensatz zur Behandlung spezifischer bereits existierender Instanzen von NewTourney.

In Ihrem speziellen Fall würde ich ahne, dass die Activity schließlich eine Instanz derKlasse schafft die Aktion, oder zumindest zu handhaben die kontextsensitiven Daten der Aktion zu halten.

+0

Bedeutet dies, dass ich nicht Gießen c als Klasse vermeiden können, und vermeiden so die Warnung ? – LongInt

+0

Klasse c; würde es weggehen lassen? oder Klasse c; wenn es möglich ist, dass es nicht einmal eine Aktivität ist! – Blundell

+0

Klasse löst diesen Fehler aus: _Typenkonflikt: Konnte nicht von Klasse in Klasse _ konvertiert werden, aber Klasse funktioniert. – LongInt

2

Klasse ist eine Klasse, die Klassen darstellt. :)

Es ist nicht "Objekt". Es ist keine Oberklasse oder gar in Ihrer "NewTourny" Hierarchie. Aus diesem Grund können Sie nicht von einer NewTourney in eine Klasse wechseln.

Die Eigenschaft .class ist eine Instanz der Klasse, die Typinformationen darstellt.

Sie können damit Reflektionsaufrufe ausführen, um etwas zu instantiieren, das Sie zum Zeitpunkt der Kompilierung nicht kennen.

+6

Eigentlich ist eine 'Klasse' ein' Objekt', das eine _klasse_ darstellt. Klassen sind Objekte, was eine der idiosynkratischen Notwendigkeiten zum Manipulieren einer 'Klasse' in einer JVM ist, die nur zwei Arten von Daten, Primitive und Subcendents von' Object' aufweist. –

1

Um die Warnung loszuwerden, können Sie Class c mit Class<? extends Tourny> ändern. Dies bedeutet, dass c kein Objekt ist, das eine von allen möglichen Klassen repräsentiert, sondern genauer eine Klasse darstellt, die von Tourny abgeleitet ist.

+0

Da c auf viele verschiedene Arten von Klassen verweisen kann, sollte es als Klasse deklariert werden. –

+0

Bei der Änderung in Klasse c, bekomme ich diesen Fehler in jeder Zeile meiner switch-Anweisung: _Type Mismatch: kann nicht von Klasse in Klasse _ – LongInt

+0

@ Michael Krussel: Das hat die Aufgabe der Beseitigung der Warnung! Vielen Dank. – LongInt

1

Die .class-Methode ist eine all-objets have, mit der Sie auf die ursprüngliche Natur des Objekts verweisen können, bevor Sie überhaupt eine Chance hatten, es zu initialisieren. Es ist nicht das Elternteil, es ist die ursprüngliche unverfälschte Vorlage von sich selbst. Es heißt ".class", weil es eine direkte Repräsentation der Klasse ist, die nur die Klassendefinition beeinflussen kann. Es erspart Ihnen, ein neues Objekt zu erstellen, um Informationen zu erhalten, die alle Mitglieder dieser Klasse ursprünglich gemeinsam haben.

2

Instanzen der Klasse Klasse repräsentieren Klassen und Schnittstellen in einer laufenden Java-Anwendung. Dies ist Teil der Java Reflection API. tutorial von Oracle:

If the type is available but there is no instance then it is possible to obtain a Class by appending ".class" to the name of the type. This is also the easiest way to obtain the Class for a primitive type.

Hier sind einige Referenzen:

  1. https://docs.oracle.com/javase/tutorial/reflect/class/classNew.html
  2. https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html
Verwandte Themen