Wenn ein Array von Objekten ein Objekt ist, ist ein Array von String kein String

8

Die Objektklasse ist eine Superklasse für jede Klasse in Java. Jede Klasse sollte also die Eigenschaften oder das Verhalten der Object-Klasse enthalten.

Dann können wir Array von Objekten wie folgt deklarieren:

%Vor%

Wenn Sie zu String kommen, warum ist die Deklaration falsch:

%Vor%     
Harika Choudary Kanikanti 08.06.2016, 07:46
quelle

6 Antworten

22

new String[]{"s","s"} ist vom Typ String[] , nicht String . T[] ist keine Unterklasse von T (es sei denn T ist zufällig Object ).

Object[] ist ein Untertyp von Object , weshalb der erste funktioniert. Tatsächlich sind alle Array-Typen subtype of Object , einschließlich, vielleicht überraschend, Arrays von Primitiven, wie int[] , obwohl int kein Object (*) ist.

Sie könnten den ersten mit spezifischeren Typen schreiben:

%Vor%

Sie können die zweite wie folgt schreiben:

%Vor%

Übrigens demonstriert s2 , dass Arrays in Java kovariant sind. Das ist problematisch, da Sie legal schreiben können:

%Vor%

, das zur Laufzeit mit einem ArrayStoreException fehlschlägt, da Sie Object referenzen nicht in String[] speichern können.

Dies ist einer der Gründe, warum Autoren wie Josh Bloch den Ratschlag "Listen an Arrays bevorzugen" (siehe Effektiver Java 2nd Ed Punkt 25) geben, da Java-Sammlungen wie List nicht kovariant sind und so leidet nicht das gleiche Problem.

(*) Um die Verwirrung zu erhöhen, sind primitive Arrays keine Subtypen von Object[] , da Primitive keine Subtypen von Object sind. Zum Beispiel wäre es ein Fehler beim Kompilieren zum Schreiben:

%Vor%     
Andy Turner 08.06.2016, 07:49
quelle
3

Etwas verwirrend ist ein Object[] ein ein Object . (Zum einen kann Java Arrays der Länge Null implementieren und Arrays Funktionsrückgabewerte zulassen.)

Es ist also sinnvoll, eine Object[] -Instanz einer Referenz vom Typ Object type zuzuweisen.

Aber das Zuweisen einer String[] -Instanz zu einer Referenz vom Typ String macht nicht Sinn. (Beachten Sie aber, dass String[] auch und Object ist.)

Also

  1. Object c = new Object[] {1,2,"22" }; Sinnvoll
  2. String s = new String[]{"s","s"}; Ist nicht sinnvoll
  3. Object s = new String[]{"s","s"}; Sinnvoll
Bathsheba 08.06.2016 07:52
quelle
1

Sein grundlegendes Java-Prinzip, Everything ist ein Object , somit können Sie Objektreferenz für alles wie Object o = new AnyOtherClass()

Sie können die Referenz einer Klasse für ihre Unterklassen verwenden List l = new Arraylist()

Aber String [] ist ein Array und Array ist kein Vorfahre von String

    
Abdullah Ahçı 09.06.2016 09:18
quelle
1

array ist eine Sammlung von Objekten oder eine Sammlung primitiver Datentypen, während string eine Folge von Zeichen ist. Wie Sie wissen, Objekt ist Super-Klasse von jeder anderen Klasse, weshalb Sie wie folgt tun: Object c = new Object[] {1,2,"22" };

Die String-Klasse ist keine Super-Klasse des Array-Typs ... Sie können also nicht wie folgt vorgehen.

%Vor%

hoffe, das wird dir helfen ...

    
Sanidhya Kumar 13.06.2016 04:52
quelle
0
%Vor%

ist gültig, da ein Array von Object s immer noch ein Object ist. Sie könnten angeben, dass c auch ein Array von Object s auf Deklarationsebene ist, wie folgt:

%Vor%

Allerdings

%Vor%

ist nicht gültig, da ein Array von String s kein String ist. Sie müssen entweder Ihr Array in ein String wie folgt umwandeln:

%Vor%

oder um es als Array zu speichern, wie folgt:

%Vor%     
Lajos Arpad 08.06.2016 08:19
quelle
0

Erstens enthält Array die Referenz von Werten, die sich in Heap befinden.

Zweitens ist die Objektklasse die Mutterklasse jeder anderen Klasse in Java. So kann Objekt-Array jede Art von Referenzwert enthalten, aber String-Array wird nur Verweis von String-Datentyp enthalten und jede Referenz verweist auf separate Zeichenfolge (string[0]= "a",string[1]="stackOverFlow"...) .

Drittens, Eine Zeichenfolge ist eine Zeichenfolge in Java.

Also kann ein Stachel-Array kein String sein, weil es sich nicht auf die Zeichenfolge bezieht, sondern auf den String-Typ von Objekten, die sich im Heap befinden.

    
paurav pareek 09.06.2016 10:16
quelle

Tags und Links