Frage Wie funktioniert eine '.class'-Eigenschaft?


Das erste Mal in Java zu entwickeln und das erste Mal für Android zu entwickeln, ist also eine ziemlich neue Frage.

Ich habe derzeit 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 macht das? .Klasse Eigentum tun, zB im 'c = NewTourny.Klasse'?

Warum kann ich c nicht als Tourny (welches die Eltern all dieser Klassen ist) casten?

Lange Frage:

Dies behandelt derzeit alle Schaltflächennavigationen in 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 "naja, all 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?


18
2018-04-09 16:49


Ursprung


Antworten:


Es ist nicht wirklich machen viel. NewTourney.class ist eher eine sprachspezifische Methode, um "das Objekt zu schreiben, das die Klasse von NewTourney"Diese Kurzschrift erlaubt es, auf die Klasse von ein NewTourney, im Gegensatz zum Umgang mit bestimmten bereits bestehende Instanzen von NewTourney.

In Ihrem speziellen Fall würde ich vermuten, dass die Activity erstellt schließlich eine Instanz der Klasse um die Aktion zu bearbeiten oder zumindest die kontextsensitiven Daten der Aktion zu halten.


10
2018-04-09 16:54



Klasse ist eine Klasse, die Klassen repräsentiert. :)

Es ist kein "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 .class-Eigenschaft ist eine Instanz der Klasse, die Typinformationen darstellt.

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


2
2018-04-09 16:58



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

Wenn der Typ verfügbar ist, aber keine Instanz vorhanden ist, ist es möglich, eine Klasse durch Anhängen von ".class" an den Namen des Typs zu erhalten. Dies ist auch der einfachste Weg, um die Klasse für einen primitiven Typ zu erhalten.

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

2
2017-09-17 16:16



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


1
2018-04-09 17:01



Die .class-Methode ist eine all-objets-Eigenschaft, mit der Sie auf die ursprüngliche Natur dieses 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.


1
2018-02-05 20:47