4 Stimmen

ArrayStoreException in Java Arrays

Es ist ein Beispiel im Buch Core Java

Zwei Klassen Employee und Manager. Manager erweitert Employee. Der folgende Code

Manager[] mans ={new Manager("Adam"),new Manager("Ben")};              
Employee[] emps =mans ;   
emps[0] = new Employee ("Charlie");//wirft tatsächlich ArrayStoreException zur Laufzeit;

Der Autor sagte, dass in dieser Situation die Elemente in Arrays SOLLTEN DEN GLEICHEN TYP BEHALTEN oder es wirft ArrayStoreException. In meinem Verständnis ist emps[0 nur eine Referenz auf die Instanz 'new Employee("Charlie")' und der Typ von emps[0 ist vorher als Employee deklariert. Warum wirft es also eine Ausnahme? Gibt es etwas falsch mit meinen Grundlagen?

4voto

Pshemo Punkte 118094

Wenn ein Array erstellt wird, merkt es sich, welche Art von Daten es speichern soll. Also, wenn du Klassen hast

class Employee { .. }
class Manager extends Employee { .. }

und du ein Array erstellst

Manager[] arrM = new Manager[10];

wird das Array merken, dass es nur Instanzen der Klasse Manager oder abgeleitete Typen speichern soll. Aber ein solches Array kann keine Überklasse von Manager speichern, da die Überklasse nicht alle Methoden oder Felder der Managerklasse haben könnte. Deshalb ist etwas wie

arrM[0] = new Manager();

in Ordnung, aber

arrM[0] = new Employee();

wirft eine java.lang.ArrayStoreException: Employee und zeigt an, dass Employee hier kein korrektes Argument ist.

Also in deinem Fall bist du

  • ein Array für Manager zu erstellen

    Manager[] mans ={new Manager("Adam"),new Manager("Ben")};
  • eine Referenz zu diesem Array unter Verwendung seines Überdatentyps Employee zu erstellen

    Employee[] emps =mans;

    (aber diese Referenz zeigt immer noch auf ein Array, das nur Manager enthalten kann)

  • und versucht, ein Employee in das Array zu platzieren

    emps[0] = new Employee("Charlie");

aber wie ich erwähnt habe, ist dies nicht erlaubt, da es möglich ist, dass Employee nicht dieselben Member wie Manager hat. Angenommen Manager kann jemanden einstellen (mit der Methode hire(...)), während Employee das nicht kann (da es diese Methode nicht hat). Was würde passieren, wenn du folgendes aufrufen würdest

    mans[0].hire(new Employee("Tom");

und emps[0] = new Employee ("Charlie"); würde keine Ausnahme werfen, sondern dich gestatten, Employee in emps[0] zu platzieren? Da mans und emps dasselbe Array verwenden, würde dies bedeuten, dass mans[0].hire(new Employee("Tom") von Employee("Charlie") aufgerufen würde, der niemanden einstellen kann, weil Employee keine hire-Methode hat.

Deshalb kannst du kein Instanz des Überdatentyps (Employee) in ein Array von Managern platzieren.

0voto

Paolo Punkte 2387

On second line you can assign an array of subclass (Manager [] mans) to a reference to an array of superclass (Employee[] emps). No problems on that... but after this line the real type of emps is

Manager[]

The real type of the array is determined at run-time and it is worth nothing it is referenced by a reference to Employee[], it sitll is an array of Manager.

So emps[0] is expected to be of type Manager.

Übersetzt mit www.DeepL.com/Translator (kostenlose Version)

0voto

jhobbie Punkte 1016

Es wirft eine Ausnahme, weil, wie es im Buch steht, die Typen unterschiedlich sind. Employee[] emps = mans; bedeutet, dass emps zwei Elemente vom Typ Manager enthält. Wenn Sie also ein neues Element hinzufügen oder ein vorhandenes Element ersetzen, muss es vom gleichen Typ sein.

Ich frage mich, ob Sie ein Array mans mit der Größe 1 gemacht haben (ich weiß nicht, warum Sie das tun würden, vielleicht ein ArrayList, wenn Sie es später erweitern wollen) und dann den Rest Ihres Codes folgen, was passieren würde. Ich wette, es würde Ihnen immer noch nicht erlauben, einen Employee in das Array einzufügen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X