Gibt es Nicht einen Punkt, um ein mit primitiven Typen, Arrays?
Ist das irgendwie das gleiche wie zu Fragen: gibt es etwas, dass die Unterklasse /Oberklasse den primitiven Typen?
(Weil ((Object) (new String[6])) instanceof Object[]
wahr ist, als String extends Object
.)
Beispielsweise int[]
ist es NUR ((Object) (new int[3])) instanceof int[]
ist wahr, unter den alles in Java?
Wenn dem so ist,
((Object) (new int[3])) instanceof int[]
ist identisch mit
((Object) (new int[3])).getClass() == int[].class
und würde ich letzteres bevorzuge, da es schneller sein soll, da Sie nicht haben, um zu überprüfen, jede Art/Klasse von Erbschaften.
- Ich hoffe, Sie sind einfach nur neugierig... und das sind Sie nicht schreiben von code, der sieht so etwas.
- In der Tat, in meinen codes, die
object
kommt aus dem parameter. Ich war gerade mit casting um diese Fälle zu überprüfen. - Wenn Sie können den code ändern, vielleicht können Sie machen Sie Ihre Methode akzeptieren ein
List<T>
als parameter anstelle eines Objekts. Dann werden Sie nicht haben, um sorgen über das Gießen. Das heißt, wir wissen nichts über das, was Sie zu tun versuchen... - ich weiß, was ich Tue. Nur, dass die Methode nicht. Die Methode ist gedacht, alles zu akzeptieren, und bestimmen Sie den Typ des Parameters.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist wirklich schwer zu verstehen, was Sie Fragen, aber ich denke, Sie Fragen sich, ob mit
getClass()
ist besser als mitinstanceof
für array-Typen.Aus der Perspektive der Lesbarkeit
instanceof
ist besser:Klar, die erste form ist mehr lesbar.
Aus der performance-Perspektive, ich kann nicht sehen, warum die beiden Versionen könnte nicht identisch sein. In der
instanceof
Fall, dieint[]
Typ hat keine Subtypen, und deshalb kann es kompiliert werden, zu etwas, das äquivalent zu oder möglicherweise sogar schneller als diegetClass()
version.Der einzige Weg, um sicher sein, was tatsächlich schneller ist schreiben eine anständige microbenchmark und führen Sie es auf die Plattformen, die Sie interessiert sind in. Und beachten Sie, dass Sie haftbar sind, um unterschiedliche performance-Ergebnisse für die verschiedenen Java-Versionen
Aber ich vermute stark, dass die performance-Differenz zu klein, um einen Unterschied zu Ihrer Anwendung. Es sei denn, Sie bereits konkrete profiling-Ergebnisse zeigen, dass dies einen Engpass ... sind Sie wahrscheinlich Ihre Zeit verschwenden.
Nicht. Es ist nicht äquivalent zu Fragen, die an alle. Java-array-Typen nicht-primitive Typen. Sie sind Referenz-Typen.
Ist es jedoch im Zusammenhang mit der Frage, ob es eine Subtyp-Beziehung zwischen array-Typen. Oder um genauer zu sein, es läuft darauf hinaus, ob Sie können eine Umwandlung von einem array-Typ zu einem anderen Typ array.
Und die Antwort auf diese Frage hängt es von der Basis-Typ; finden Sie unter JLS 5.5.1. Referenz Type-Casting. Wenn die Basis-Typen sind (verschiedene) primitive Typen, dann ist die Antwort: Nein. Wenn die Basis-Typen sind Referenztypen, wenn Sie dann werfen kann, von einem Basistyp (
BC1
) zu den anderen (BC2
), dann wird der cast mit der array-Typen (BC1[]
zuBC2[]
) ist auch legal.So bedeutet dies, dass
instanceof
undgetClass()
tests geben die gleiche Antwort für das array von primitiven Typen, aber nicht für alle array-Typen.In der Tat, es war wohl ein Fehler in der original-Sprache Java design ermöglichen alle casting zwischen den verschiedenen array-Typen. Dies führt zu Anomalien wie diese:
String[] instanceof Object[]
wahr ist. Und in der RegelSubClass[] instanceof SuperClass[]
wahr ist. Die meisten konzentriere ich mich auf die Richtigkeit, diesomething instanceof int[]
ist identisch gleichsomething.getClass() == int[].class
in allen Fällen. Als Sie sagte: "das int[] hat Typ keine Subtypen~, so kann ich annehmen, dass Sie identisch sind, in allen Fällen?(A instanceof B) gibt true zurück, wenn Eine "isa" B, oder wenn Sie verwenden konnte, wo ein B zu erwarten ist.
Jeder Vergleich der Objekte der Klasse oder Klassen-Namen mit == vergleicht auf Identität. Wenn Sie brauchen, um zu wissen, dass A und B GENAU die gleiche Art, könnten Sie mit A. getClass() == B. getClass().
Die primitiven Typen Erben nicht vom Objekt, sondern arrays tun. Zum Beispiel können Sie sagen
aber nicht
Letztere werden nicht kompiliert.
In der Objekt-Orientierten Programmierung, die Sie in der Regel kümmern Gleichwertigkeit anstatt die genauen Typen. Ich würde behaupten, dass Sie fast immer wollen, um zu testen, Erreichbarkeit (mit instanceof) anstatt für Identität (mit ==).
Beachten Sie, dass Ihre Besetzung zum Objekt ist nicht erforderlich.
something instanceof int[]
ist identisch mitsomething.getClass() == int[].class
in allen Fällen, ist es nicht?Java ist keine Reine OO-Programmiersprache,denn es gibt primitive Datentypen.
Q:gibt es etwas, Unterklasse /Oberklasse den primitiven Typen?
A: Nein,der primitive hat keine subclass von superclass, es ist nur primitiver Typ.
Arrays in Java ist ein Objekt-Typ, ob es der Inhalt ist Objekt, Typ primitiver Typ, so dass die folgenden
Aussage wahr ist:
Q:würde ich letzteres bevorzuge, da es schneller sein soll, da Sie nicht haben, um zu überprüfen, jede Art/Klasse von Erbschaften.
A:Nein,es gibt keine Beweise. Auch wenn es stimmt, ist es kein problem in Java, für die Effizienz ist nicht immer unsere überlegung