The method XXX is undefined for the type YYY

Halli hallo,

ich habe ein Problem bei meinem Java-Code ^^
Zuerst: Ich nutze Eclipse und bin dabei einen Supermarkt zu simulieren, bei dem sich ein Kunde in eine Warteschlange stellen soll.

Dafür:

import supermarkt.Kunde;


/\*\*
 \* Die Klasse Warteschlange kennt den ersten,
 \* sowie den letzten Kunden der Warteschglange.
 \*
 \*/
public class Warteschlange { //die Warteschlange soll nur Objekte der Klasse Kunde aufnehmen können!

 private Kunde erster;
 private Kunde letzter;


 /\*\*
 \* Die Klasse Warteschlange ist zu Beginn leer, deshalb ist der Wert des ersten, 
 \* sowie des letzten auf Null gesetzt.
 \*/
 public Warteschlange ()
 {
 this.erster = null;
 this.letzter = null;
 }

public void Kundehinzu (Kunde k)
 {
 if (this.erster == null)
 {this.erster = k;
 this.letzter = k;}
 else
 {
 this.letzter.**setKontakt(k)** // The method setKontakt(Kunde) is undefined for the type Kunde
 this.letzter = k;
 }
 }

 }

Beim dickgedruckten ist der Fehler zu finden.
Natürlich gibt es die Methode auch beim Kunden.
Ich glaube das hängt mit der spezifizierung der Warteschlange zusammen. Aber eigentlich ist „Kunde k“ doch ein Objekt der Klasse Kunde >.

Ein Semikolon vergessen -Problem aber immernoch da

this.letzter.setKontakt(k);

da fehlt natürlich das Semikolon - habs aber nur beim Schreiben vergessen - der Fehler ist natürlich immernoch da!

hallo

verrätst du uns auch noch den code der klasse kunde (der eigentlich interessante code!)? dann kann dir vielleicht jemand helfen. ansonsten kann man nur die kristallkugel befragen…

vermutlich ist die entsprechende methode als private oder so definiert und nicht als public. oder du hast einen tippfehler in der methode.

lg
erwin

hallo

verrätst du uns auch noch den code der klasse kunde (der
eigentlich interessante code!)? dann kann dir vielleicht
jemand helfen. ansonsten kann man nur die kristallkugel
befragen…

public class Kunde {

 private Kunde kontakt;
 private Zufallsgenerator zg;
 private int waren; //Anzahl der Waren (eine Ware = eine bestimmte Zeiteinheit)

 /\*\*
 \* Hier wird ein neuer Kunde mit einem b Warenkorb und ohne Kontakt erstellt.
 \* Waren = Gr��e des Warenkorbs (max. Anzahl der Waren) 
 \*/
 public Kunde(int groesse)
 {
 this.kontakt = null;
 this.waren = zg.AnzahlDerWaren(groesse);
 }

 /\*\*
 \* @return Kontakt = Der Kontakt des Objektes Kunde wird herausgegeben.
 \*/
 public Kunde getKontakt() {
 return kontakt;
 }

 /\*\*
 \* @param kontakt hier kann man den Kontakt des Kundes ver�ndern.
 \*/
 public void **setKontakt** (Kunde kontakt) {
 this.kontakt = kontakt;
 }

 /\*\*
 \* @return Anzahl der Waren im Warenkorb
 \*/
 public int getAnzahlDerWaren() {
 return waren;
 }

 /\*\*
 \* @param waren setzt die Anzahl der Waren auf einen gew�nschten Wert.
 \*/
 public void setAnzahlDerWaren(int waren) {
 this.waren = waren;
 }

 public Kunde findeLetzten() throws NullPointerException
 {
 if(this.kontakt==null)
 {
 return this;
 }

 else
 {
 try{
 return this.kontakt.findeLetzten();
 }
 catch (Exception e)
 {
 return this.kontakt;
 }
 } 

vermutlich ist die entsprechende methode als private oder so
definiert und nicht als public. oder du hast einen tippfehler
in der methode.

Nein, denn dann würde Eclipse das ja anzeigen, wenn der Punkt gemacht wird (dann kommen ja alle möglichen Funktionen des Objekts - aber da ist nichts, was ich erstellt habe sondern nur die der Überklasse.

lg
erwin

hallo

ist das auch der vollständige code? grund der frage: in der klasse „Warteschlange“ hast du ein „import supermarkt.Kunde“ stehen, in der klasse „Kunde“ aber keine entsprechende package-anweisung. mögliches problem: du hast zwei klassen mit namen „Kunde“, einmal ohne package und einmal in der package „supermarkt“. also genaugenommen hast du also zwei klassen, einmal mit namen „Kunde“ und einmal mit namen „supermarkt.Kunde“ (der packagename ist teil des klassennamens). wenn du also immer nur die klasse „Kunde“ um methoden erweiterst, nicht aber die „supermarkt.Kunde“, dann ist das verhalten klar. prüf das bitte mal nach und melde dich dann wieder…

lg
erwin

Also:

Das sieht so aus bei mir:

Package abfertigung

  • Abfertigung () //vereint im Prinzip nur Warteschlange und Kasse
  • Warteschlange () //Soll nur Kunden aufnehmen
  • Kasse () //soll nur Kunden bearbeiten

Package supermarkt

  • Kunde (int maximaleWarenanzahl) // das Objekt mit dem gehandelt wird
  • Supermarkt (int anzahlDerAbfertigungen) // erstellt Abfertigungen und managed im Prinzip alles (logbuch, Aktionen für den Kunden)

Package hilfsprogramm

  • Zufallsgenerator () //erstellt Zufallszahlen
  • Logbuch () // soll alles dokumentieren - hab da noch keine Idee wie ich das umsetzen soll

In der Klasse Supermarkt ist das selbe Problem.
Ich kann auf die Methoden des Objekts Kunde nicht zugreifen.
Nunja - dank meiner Dummheit gibts hier noch ne Warning (keine Error-Meldung):

public class Supermarkt Kunde\>

„The type parameter Kunde is hiding the type Kunde“

Moien

Erwin Rockenbauer hat zu 95% Recht. Du hast die Dateien Kunde.java und Kunde.class mindestens 2x in dem Projekt drin (Kuck auf der Platte nach, nicht im IDE).

cu

Präzisierung
zur Klarstellung: ich vermute, dass die Kunden-Klasse 2x im Klassenpfad drinnen ist - bedeutet nicht notwendigerweise, dass du 2x die Kunden.java hast. Kann z.b. sein, dass du ein JAR-File mit einer alten Version der Kunden-Klasse im Klassenpfad drinnen hast und dass die von der Reihenfolge her zuerst geladen wird.

Leider gibt es ziemlich viele Möglichkeiten, wo sich diese Klasse versteckt haben kann - da musst du leider mal suchen…

Hallo.

Ich bin mir nicht ganz sicher, aber ich denke, es liegt an folgendem:

import supermarkt.Kunde;

/**
* Die Klasse Warteschlange kennt den ersten,
* sowie den letzten Kunden der Warteschglange.
*
*/
public class Warteschlange { //die Warteschlange
soll nur Objekte der Klasse Kunde aufnehmen können!

Hm, wofür dass hinter dem Klassennamen? Damit kann man Templates bauen, die verschiedene Typen aufnehmen können. Das Kunde, was dort steht, bezeichnet meines Wissens nicht die Klasse Kunde, sondern ist eben der Template-Platzhalter. Beim Deklarieren von Objekten der Klasse Warteschlange, wird dann der Typ angegeben, also z.B. so:
Warteschlange asdf;
Warteschlange qwer;

Beides wäre gültiger Code. Wenn du das einfach weglässt, hast du eine Klasse ohne Templates. Dass nur Kunde-Objekte hinzugefügt werden können, stellst du ja schon dadurch sicher, dass die Methoden zum Hinzufügen nur Kunde-Objekte als Parameter akzeptieren.

Die Fehlermeldung ergibt sich dann daraus, dass über den Template-Parameter zur Compile-Zeit nur bekannt ist, dass er von Object abgeleitet ist. Was die tatsächliche Klasse aber genau ist, wird ja erst bei der Deklaration von Warteschlange-Objekten festgelegt.

Sebastian.

Ich habe gesucht… die ganze Festplatte habe ich durchsuchen lassen…
Es gibt 2 Dateien die den Namen „Kunde“ enthalten. Eine java-Datei und eine class-Datei. Letztere habe ich gelöscht und das Problem ist dasselbe.
Wenn ich die Typisierung, also das hinter den Klassen lösche geht ja auch alles… aber mit derselbigen gehts eben nicht.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]