[Java]ASCII / Ansprechen von Vector-Objekten

Hallo!

  1. ASCII

Vector mySlaveVector = new Vector();

for(int i=0; i

In den Vector möchte ich Slave-Objekte speichern, die „SlaveA“, „SlaveB“, „SlaveC“,… heißen (ASCII 65 = „A“). Der Compiler sagt: „Genauigkeitsverlust bei int, byte ist erforderlich.“ Was muß ich ändern, damit es funktioniert? Gibt es vielleicht noch eine andere Lösung für das Problem?

  1. Ansprechen von Vector-Objekten

Später möchte ich in einer For-Schleife (i bis j) die Namen aller Slave-Objekte (also nameSlave) mit System.out.println(???) ausgeben. Bis jetzt ist es mir jedoch noch nicht gelungen, Attribute von Slave-Objekten, die im Vector mySlaveVector gespeichert sind anzusprechen. Wie kann ich dies bewerkstelligen?

Vielen Dank für alle Tips.

Grüße, Tanja

Hallo!

  1. ASCII

Vector mySlaveVector = new Vector();

for(int i=0; i

Compiler sagt: „Genauigkeitsverlust bei
int, byte ist erforderlich.“ Was muß ich
ändern, damit es funktioniert?

i ist vom Typ int und nicht vom Typ byte. Somit kannst Du entweder i nach byte umtypen oder i auf byte casten.

  1. Ansprechen von Vector-Objekten

Später möchte ich in einer For-Schleife
(i bis j) die Namen aller Slave-Objekte
(also nameSlave) mit
System.out.println(???) ausgeben.
Bis jetzt ist es mir jedoch noch nicht
gelungen, Attribute von Slave-Objekten,
die im Vector mySlaveVector gespeichert
sind anzusprechen. Wie kann ich dies
bewerkstelligen?

Ich verweise auf http://java.sun.com/products/jdk/1.3/docs/api/java/u…
Dort hast Du nun mehrere Möglichkeiten. Die schönste läuft über Enumerations (siehe http://java.sun.com/products/jdk/1.3/docs/api/java/u… )

Problem ist, das die Rückgabe vom Typ Object ist. Der Compiler kann i.d.R. nicht den Typ von allgemeinen Objekten bestimmen, also nimmt man an dieser Stelle das allgemeinste Objekt das es in Java gibt. Das ist das Object-Objekt. Du bist aber etwas schlauer als der Compiler und kannst nun das Objekt welches Du mit get bekommst (siehe http://java.sun.com/products/jdk/1.3/docs/api/java/u… ) auf Slace casten, d.h. Du definierst den Typ um. Falls das nicht funktioniert (weil der Typ doch ein anderer war), dann wird eine Exception „geschmissen“. Das kann man noch abfangen und eine Fehlermeldung ausgeben. Fertig.

Vielen Dank für alle Tips.

Dafür nicht. Viel Spaß beim Lesen in der Doku.

Grüße, Tanja

MfG Frank

Hallo Frank!

Erst mal Danke für Deine Antwort!

// aber nur wenn j auch vom Typ byte ist.

byte[] b = new byte[]{i+65};

j ist ein int, also:

byte[] b = new byte[]{(byte i)+65};

Damit bringt der Compiler bei mir auch eine Fehlermeldung (Fehler 39: Es wurde ‚)‘ erwartet.)

i ist vom Typ int und nicht vom Typ byte.
Somit kannst Du entweder i nach byte
umtypen oder i auf byte casten.

Klingt logisch, aber dann müßte es doch byte[] b = new byte[]{(byte) i+65}; heißen, oder? Damit kommt übrigens die gleiche Fehlermeldung wie bei meiner Lösung.

Ich arbeite mit dem JBuilder 3 Standard als Entwicklungsumgebung. Wenn ich das Programm dort kompiliere, bekomme ich die Fehlermeldung „Genauigkeitsverlust bei int, byte ist erforderlich“. Gerade habe ich festgestellt, daß es funktioniert, wenn ich genau das gleichen Code unter DOS kompiliere!

Probier mal das:
public class Hello{
public static void main(String args[]){
String nameSlave;
byte[] b = new byte[]{65};
String s = new String(b);

nameSlave = „Slave“ +s;

System.out.println(nameSlave);
}
}

Läuft einwandfrei. Warum funktioniert der Code unter DOS, aber nicht im JBuilder??? *wunder Ich nutze bei beiden JDK 1.2. (Mir ist schon klar, daß der Code sowieso nur auf Windoof Maschinen, bzw. bei solchen, bei denen 65 auch wirklich „A“ ist funktionieren kann, aber trotzdem müßte es doch auch im JBuilder laufen.)

die Namen aller Slave-Objekte
(also nameSlave) ausgeben.

http://java.sun.com/products/jdk/1.3/docs/api/java/u…

Ich hatte es bis jetzt mit elementAt() und get() versucht. Mit dem gleichen Ergebnis:

Master1 verfügt über
Slave@7d7c0862
Slave@7d240862
Slave@7d040862
Slave@7c5c0862
Slave@7c3c0862
als Slave-Objekte!

Ich möchte aber:

Master1 verfügt über
SlaveA
SlaveB
SlaveC
SlaveD
SlaveE
als Slave-Objekte!

Problem ist, das die Rückgabe vom Typ
Object ist.

Eigentlich ist sind es keine Objekt, sondern eine Referenzen auf ein Objekte, oder?

auf Slave casten

Genau das ist mein Problem. Selbst, wenn ich dem Compiler mitteile, daß es sich um ein Slave-Objekt handelt, gibt er mir trotzdem nur die Referenz und nicht den Inhalt.

for (Enumeration e = mySlaveVector.elements() ; e.hasMoreElements() :wink:
{
System.out.println((Slave) e.nextElement());
}

Wie kriege ich ihn dazu, mir den Inhalt anstatt der Referenz zu geben?

Grüße, Tanja

Wie kriege ich ihn dazu, mir den Inhalt
anstatt der Referenz zu geben?

Einen wirklichen Unterschied zwischen Inhalt und Referenz wie in C/C++ gibt es in Java nicht, aber du kommst ohne Probleme über die Referenz an alle Eigenschaften und Methoden des Objekts:

for (i = 0; i

Hallo Robert!

du kommst ohne
Probleme über die Referenz an alle
Eigenschaften und Methoden des Objekts

Danke für Deine Antwort, aber leider funktioniert es immer noch nicht so richtig. Die Methode showSlave() der Klasse Master soll die Namen aller Slave-Objekte anzeigen, die in dem Vector mySlaveVector angelegt wurden:

Vector mySlaveVector = new Vector();

for(int i=0; i

Nach Deinem Beispiel müßte die Methode also folgendermaßen aussehen:

void showSlave(Vector mySlaveVector)
{
System.out.println(this.nameMaster +" verfügt über");

for (int i = 0; i

Compiler meldet: „Variable nicht gefunden in Klasse java.util.Vector.“ Was ist falsch? Warum sucht er die Variable nicht in den Slave-Objekten von mySlaveVector, sondern in der Vector-Klasse?

Sollte für nextElement statt elementAt
auch gehen und du brauchst die Referenz
aus dem Vector nicht extra auf Slave
umcasten.

Mit nextElement() bekomme ich die gleiche Fehlermeldung.

Grüße, Tanja

[…]

Nach Deinem Beispiel müßte die Methode
also folgendermaßen aussehen:

void showSlave(Vector mySlaveVector)
{
System.out.println(this.nameMaster +"
verfügt über");

for (int i = 0; i

Compiler meldet: „Variable nicht gefunden
in Klasse java.util.Vector.“ Was ist
falsch? Warum sucht er die Variable nicht
in den Slave-Objekten von mySlaveVector,
sondern in der Vector-Klasse?

Weil er nicht weiß, daß das Objekt (oder die Objektreferenz :wink:) ein Objekt vom Typ Slave ist. Der Compiler weiß nur, daß die Rückgabe von der Methode elementAt etwas vom Typ Object ist. Du(!!!) mußt dem Compiler den korrekten Typ durch einen Cast mitteilen.

Sollte für nextElement statt elementAt
auch gehen und du brauchst die Referenz
aus dem Vector nicht extra auf Slave
umcasten.

Mit nextElement() bekomme ich die gleiche
Fehlermeldung.

Gleiche Begründung warum das so ist.
Denke immer daran, daß der Compiler doof ist. Ich glaube auch, daß das Problem den richtigen Typ zu bestimmen NP-hart ist. Also gar nicht für beliebige Konstrukte durch einen Algorithmus (und nichts anderes ist ein Compiler) lösbar.
Du mußt dem Compiler an diesen Stellen einfach helfen.

Grüße, Tanja

MfG Frank

Hallo Frank!

Jetzt nerve ich zum letzten Mal mit meinem ersten Versuch mit Vectoren unter Java (bis jetzt habe ich immer nur Arrays verwendet), versprochen. :wink:

void showSlave(Vector mySlaveVector)
{
System.out.println(this.nameMaster +"
verfügt über");

for (int i = 0; i

Compiler meldet: „Variable nicht gefunden
in Klasse java.util.Vector.“ Was ist
falsch? Warum sucht er die Variable nicht
in den Slave-Objekten von mySlaveVector,
sondern in der Vector-Klasse?

Weil er nicht weiß, daß das Objekt (oder
die Objektreferenz :wink:) ein Objekt vom
Typ Slave ist. Der Compiler weiß nur, daß
die Rückgabe von der Methode elementAt
etwas vom Typ Object ist. Du(!!!) mußt
dem Compiler den korrekten Typ durch
einen Cast mitteilen.

Ok, auf diese glorreiche Idee bin ich dann nach einer Weile auch gekommen, aber mit System.out.println((Slave)mySlaveVector.elementAt(i).nameSlave); kam immer noch die gleiche Fehlermeldung.

Doch mit
System.out.println(((Slave)mySlaveVector.elementAt(i)).nameSlave);
konnte ich den Compiler tatsaechlich dazu ueberreden, mir die Attribute der Slave-Objekte anzuzeigen! Sieg! :smile:

Denke immer daran, daß der Compiler doof
ist. Ich glaube auch, daß das Problem den
richtigen Typ zu bestimmen NP-hart ist.
Also gar nicht für beliebige Konstrukte
durch einen Algorithmus (und nichts
anderes ist ein Compiler) lösbar.
Du mußt dem Compiler an diesen Stellen
einfach helfen.

Ok, jetzt hab ich’s verstanden, Compiler sind doof, man muss ihnen also alles genau erklaeren! Danke noch mal.

Gruesse, Tanja

Weil er nicht weiß, daß das Objekt (oder
die Objektreferenz :wink:) ein Objekt vom
Typ Slave ist.

Sorry für den Nonsense den ich in Richtung Cast weglassen erzählt hab, war noch zuviel in den VB-Collections mit Variant drinnen. :o)

Grüße, Robert

OT: Re^7: [Java] Ansprechen von Vector-Objekten

Weil er nicht weiß, daß das Objekt (oder
die Objektreferenz :wink:) ein Objekt vom
Typ Slave ist.

Sorry für den Nonsense den ich in
Richtung Cast weglassen erzählt hab, war
noch zuviel in den VB-Collections mit
Variant drinnen. :o)

Ich erinnere mich dunkel an diese Sachen. Mein Problem war eher, daß ich seit etwa 2 Monaten schon wieder so viel vergessen habe. Insbesondere die Cast-Spielereien.

Grüße, Robert

Grüße zurück aus Kiel,
Frank

Hallo Frank!

Jetzt nerve ich zum letzten Mal mit
meinem ersten Versuch mit Vectoren unter
Java (bis jetzt habe ich immer nur Arrays
verwendet), versprochen. :wink:

Du nervst nicht. Manchmal ist ein bestimmtes API-Konzept einfach schwer zu verstehen. Und manchmal muß man sich dem Problem eben langsam nähern :wink:

[…]

etwas vom Typ Object ist. Du(!!!) mußt
dem Compiler den korrekten Typ durch
einen Cast mitteilen.

Ok, auf diese glorreiche Idee bin ich
dann nach einer Weile auch gekommen, aber
mit
System.out.println((Slave)mySlaveVector.elementAt(i).nameSlave);
kam immer noch die gleiche Fehlermeldung.

Muß eben auch, da der „.“-Operator eine höhere Auswertungspriorität hat, als eben der Cast-Operator (…). Das ist wie die Punkt-vor-Strich Regel in der Mathematik.
Hier eben nur Punkt-vor-Cast. Die Zeile
(Slave)mySlaveVector.elementAt(i).nameSlave heißt

  • mySlaveVector vom Typ Vector.
  • mySlaveVector.elementAt(i) vom Typ Object.
  • mySlaveVector.elementAt(i).nameSlave ist keine Methode im Objekt Object.
    –> Fehler
    Der Compiler kann also keinen Cast anwenden, da erst die Punkte ausgewertet werden.

Doch mit

System.out.println(((Slave)mySlaveVector.elementAt(i)).nameSlave);
konnte ich den Compiler tatsaechlich dazu
ueberreden, mir die Attribute der
Slave-Objekte anzuzeigen! Sieg! :smile:

Genau, da aus mySlaveVector.elementAt(i) vom Typ Object mittels Cast ein Objekt vom Typ Slave gemacht wird. Erst dann wird der Punkt für nameSlave ausgewertet und dann funktioniert es. ;->>>

[…]

Du mußt dem Compiler an diesen Stellen
einfach helfen.

Ok, jetzt hab ich’s verstanden, Compiler
sind doof, man muss ihnen also alles
genau erklaeren! Danke noch mal.

Dafür nicht.

Gruesse, Tanja

Grüsse zurück aus Kiel
Frank