Typ der Typ der Referenz mit dem Wert null?
Laut:
http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html
4.5.2 Variablen von Referenztyp
Ein Referenz-Typ null
Referenz.
Ist es möglich, zum abrufen der deklarierte Typ der Referenz-Typ, wenn der zugewiesene Wert ist null
?
Insbesondere in einer Methode, die verwendet reflektion, möchte ich die Methode zur null-sicher und wirken auf den ursprünglichen deklarierten Typ (obwohl ich weiß, dass der folgende code-Schnipsel nicht funktioniert), zum Beispiel:
String referenceType = null;
MyReflectionClass.reflectionMethod(referenceType);
...
public static void reflectionMethod(Object referenceType) {
Class<?> declaredType = referenceType.getClass();
}
Wäre ich nicht abgeneigt, um die Verwendung von Generika zu haben, geben T
statt Object
als den deklarierten Parametertyp, falls erforderlich.
Edit: ich weiß, dass .getClass()
arbeitet auf der Instanz, nicht der deklarierte Typ. Ich Frage mich, ob es möglich war, die Fragen zu Referenz für es deklarierten Typ. Da Klassenhierarchien statisch sind, sollte es kein problem sein, diese information zu bekommen.
Edit2: Hier, die situation ist klar: Ist Java "pass-by-reference" oder "pass-by-value"?
Java ist nur pass-by-value, auch wenn ein Referenz-Typ verwendet wird, ist es immer behandelt, als wenn der Wert (Objekt-Instanz) übergeben wird (auch wenn das Innenleben nur ein Zeiger auf ein Objekt). Dies bedeutet, dass Java nicht wirklich ein Referenz-Typ, kennt Ihr Typ (zumindest so weit wie der Programmierer ist besorgt), es ist alles in der Wert-Instanzen.
Daher ist es unmöglich zu bestimmen, die Art der null
Wert.
- Nein, das ist unmöglich.
- Es ist falsch zu sagen, dass die Objekt-Instanz als Wert übergeben. Was passiert, ist, dass die Referenz wird als Wert übergeben.
- Aber Java verarbeitet keine Referenz (call), um die Referenz als Wert. Wenn dies nicht der Fall war, dann wird ein null-Objekt wäre hier noch eine Referenz auf ein Objekt. Es ist nicht. java.sun.com/docs/books/jls/third_edition/html/... Staaten "Die Referenz-Werte (oft nur Verweise) sind Zeiger auf diese Objekte, und eine spezielle null-Verweis, der sich auf kein Objekt." Artikel javadude.com/articles/passbyvalue.htm in dem verlinkten stackoverflow-Frage erklärt das sehr gut.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In einem Wort, Nein. Es nicht machen eine ganze Menge Sinn zu versuchen, die Mitglieder einer null-Referenz, obwohl, da null bedeutet die Abwesenheit von etwas. Du bist wahrscheinlich besser dran, nur dis-erlaubt null als Eingang, wahrscheinlich durch das werfen einer
NullPointerException
.Wenn Sie behandeln müssen, null, vielleicht der beste Weg, um explizit übergeben Sie die Klasse verweisen (oder noch besser, ein direkter Verweis auf die Methode in Frage).
Wenn Sie können immer nur erhalten den null-Wert, ist es schwierig (unmöglich, es sei denn, es gibt andere Einschränkungen) zu tun, viel besser, als eine sehr glückliche Vermutung.
Class.getMethod(String, Class<?>...)
wo einnull
parameter-Wert für den Aufruf der Ziel-Methode gültig sein. So hier, es gibt einen Sinn, es zu tun.Verkennst du.
getClass()
sagt Ihnen nicht den deklarierten Typ der variable, es sagt Ihnen, die Art der Objekt, wenn es einen gibt. Und lasst uns aufhören und einen Schritt zurück für eine minute - die variable würde Sie sprechen, wenn Sie es getan haben? Die ursprüngliche variable? Die parameter der Methode? Jede andere variable, die Sie Durchlaufen auf dem Weg? Das wäre der schiere Wahnsinn.Du findest nicht den deklarierten Typ eines
null
Referenz. Generika können nicht wirklich helfen, entweder, wie Sie sind gelöscht, zur compile-Zeit. Einige oder andere Weise werden Sie zu Durchlaufen haben, den Typ zur Laufzeit, wenn Sie es wissen müssen, für dienull
Fall.Nein ist es nicht. In deinem Beispiel bekommst du einen null-Zeiger-Ausnahme beim Versuch, eine Methode aufzurufen, die auf die null-Referenz referenceType.
Genauer gesagt, es ist nicht möglich, da der konkrete Typ ist nicht neccesarily zur Kompilierzeit bekannt, wenn ich z.B. deklarieren Sie eine Referenz vom Typ Object und weisen Sie eine Zeichenfolge dann Ihre Methode zu entdecken, dass das Objekt ein String kein Objekt ist.
String
, sonst wäre es nicht von einem Werttyp.Ich bin nicht sicher, es ist hilfreich, die in Ihrem Kontext, aber können Sie Generika für die Erreichung etwas ähnliches - Java 1.5+ hält geben Sie Informationen für die Unterklasse.
<...>
Klammern. Wenn ich das machen könnte, dann könnte ich auch statisch festgelegt, der Typ in der Parameterliste.