inconvertible types hilfe

fill

Mitglied
hallo,
ich habe folgenden code:

Java:
private void verarbeiteMulDiv() {
        if((char)otKeller.top() == '*' ){
            werteAus();
        }    
    }

otKeller ist ein Object das den Stack impementiert.

die fehlermeldung lautet so:
inconvertible types
found : java.lang.Object required: char

durch weglassen des expiziten castens verändert sich nichts

Java:
private void verarbeiteMulDiv() {
        if(otKeller.top() == '*' ){
            werteAus();
        }    
    }

außer der meldung, die lautet nun:

incomparable types: java.lang.Object and char



ein ähnliches problem habe ich hier

Java:
int zahl1; 
zahl1 = (int) odKeller.top();

mit der meldung:

inconvertible types
found : java.lang.Object required: int


ich füchte fast das ich beim casten etwas entscheidendes fals mache... aber was?
weiß jemand wie ich das problem lösen kann?
ich bedanke mich schon mal und
viele grüße fill
 
Zuletzt bearbeitet:
Zeig mal die Klasse von otKeller.
Was verwalltest du in deinem Keller? Was haben die Dinger für einen typ, was liefert top() wirklich zurück?
Schau dir mal das Thema Generics an...


falls du wirklich Integer drinnen hast
kannst du statt:
zahl1 = (int) odKeller.top();

zahl1 = (Integer) odKeller.top();

schreiben...
 
die klasse von otKeller :


Java:
import java.util.*;

public class Stapel implements Stack
{
    private ArrayList stapel ;
    
    public Stapel()
    {
       stapel = new ArrayList();
    }
    
    public void push(Object pNeu){
        stapel.add(pNeu);    
    }
    
    public void pop(){
        if(isEmpty()==false){
            stapel.remove(stapel.size()-1);
        }
    }
        
    public Object top(){
        if(isEmpty()==false){
            return stapel.get(stapel.size()-1);
        }
        return null;
    }

    public boolean isEmpty(){
       return stapel.isEmpty();
    }


    
    
}



hilft das? die aufgabe war einen allgemein nutzbaren stack zu programmieren um ihn in mehren anwendungen zu benutzen, deswegen wird mit Object gearbeitet.
 
was veranlaßt dich denn dazu, eine Codezeile wie
> if((char)otKeller.top() == '*' ){
zu programmieren?

allgemein könnte man den Gedanken äußern, dass ein Objekt niemals == einem char ist, und wieso gerade * und nicht a oder b oder c?
hast du vielleicht ein Programm welches Rechenzeichen in den Stack schreibt oder so?
erzähl doch bitte mehr,
poste den Code dazu wo ein * oder ähnliches gespeichert wird
 
Das ganze könnte man mit Generics wirklich etwas schöner lösen.
Aber ohne Generics:
Du hast ein Objekt vom Typen Integer, welcher einen int speichert. Das weiss aber der Compiler dort nicht - du anscheinend schon. Also musst du zuerst in einen Integer (Wrapper-Objekt) casten und von diesem [c]intValue()[/c] holen. Also so was wie [c]zahl1 = ((Integer) odKeller.top()).intValue();[/c].
Da es seit Java 5 aber Autoboxing gibt (automatisch z.B. von int -> Integer wenn nötig), musst du [c]intValue()[/c] nicht mehr aufrufen. Also wären wir noch bei [c]zahl1 = (Integer) odKeller.top();[/c].
Würdest du Generics verwenden, wüsste man an dieser Stelle bereits, dass da ein Integer rausspringt, und du könntest einfach [c]zahl1 = odKeller.top();[/c] verwenden (dank Autoboxing 😉 ).
 
Wenn die Klasse wirklich allgemein verwendbar sein sollte, dann braucht ihr Generics.


Ungefähr so (ungetestet):
Java:
import java.util.*;
 
public class Stapel<T> implements Stack<T> {
    private List<T> stapel ;
    
    public Stapel() {
       stapel = new ArrayList<T>();
    }
    
    public void push(T pNeu) {
        stapel.add(pNeu);    
    }
    
    public T pop(){
        if(! isEmpty()){
            return stapel.remove(stapel.size()-1);
        } 
        throw new NoSuchElementException();
    }
        
    public T top(){
        if(! isEmpty()){
            return stapel.get(stapel.size()-1);
        }
        return null;
    }
 
    public boolean isEmpty(){
       return stapel.isEmpty();
    }
}
 
wie gesagt war die erste aufgabe enien allgemeinen Stack zu programmieren, die zweite aufgabe war einen rechner mit priorität (punkt vor strich rechnung) mit hilfe des Stacks zu programmieren.
dort werden 2 stacks odKeller und otKeller erstellt in welche mit Strings bzw. einzelnen rechenzeichen gefüllt werden. im programmverlauf wird es anmachnen stellen nötig zu wissen welches zeichen im Stack ganz oben ist. oder eben auch eine zahl aus dem stack zwischenzuspeichern.

ich habe übrigens folgendes probiert, was keine (!) fehlermeldung ausgibt:

Java:
private void verarbeiteHoch() {
        if(otKeller.top().equals('^')){
            werteAus();
        }   
    }

das * in den letzten posts war eher willkürlichgewaählt, da es auch mit keinem anderen char funktioniert.

fällt euch dazu noch was ein?

edit:

mit
Java:
zahl1 = ((Integer) odKeller.top()).intValue();

kann ich zwar kompileren aber ich bekomme laufzeitfehler...

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at RechnermitPrioOhneKlammer.werteAus(RechnermitPrioOhneKlammer.java:88)
at RechnermitPrioOhneKlammer.liesTerm(RechnermitPrioOhneKlammer.java:64)

ich habe ja in meinem stack Strings drin, wie bekomme ich die int werte von diesen Strings zb. "23" als 23?
 
Zuletzt bearbeitet:
> fällt euch dazu noch was ein?

alles ist allen sonnenklar, in diesem Code beispielsweise wird char auf Char autogeboxt, da geht der Vergleich mit beliebigen Objects,
andersrum kann Object nicht auf char umgewandelt werden,

die Fragen an dich richten sich hauptsächlich danach, zu erfahren was du eigentlich möchtest
und haben auch zum Ziel dass du alles verstehst,

bisher ist sicherlich von allen ein wirres Durcheinander verschiedener Ideen, aber was Java so tut ist ziemlich klar
 
die Fragen an dich richten sich hauptsächlich danach, zu erfahren was du eigentlich möchtest
und haben auch zum Ziel dass du alles verstehst,

wie gesagt, in den Stack werden Strings reingeworfen, und ich möchte irgentwann diese Strings aus dem Stack mit .top() wieder haben, um einerseits festzustellen um welche zeichen es sich handelt, und andererseits mit ihnen auch zu rechnen. ich hoffe das ist so weit verständlich. Mit generics wollte ich eigentlich nicht arbeiten weil, das ganze in einem rahmen bleiben sollte, und (da bin ich mir sicher) auch so funktioniert (, wenn man die richtigen befehle hat/kann/benutzt) .

im moment versuche ich dies mit diesen :

Java:
if(otKeller.top().equals('^'))

und diesen

Java:
zahl1 = ((Integer) odKeller.top()).intValue();

befehlen, doch beim letzteren treten laufzeitfehlerauf auf:

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at RechnermitPrioOhneKlammer.werteAus(RechnermitPrioOhneKlammer.java:88)
at RechnermitPrioOhneKlammer.liesTerm(RechnermitPrioOhneKlammer.java:64)


jetzt würde ich gerne wissen ob das von prinzip her richtig ist und was ich ändern muss um es lauffähig zu bekommen.
das ist schon alles was ich wollte, also kann mir da einer nen guten ratschlag oder gar die lösung anbieten?
 
die Zeichenkombination 'String' taucht im gesamten Thread erst um 17.13 auf, da wäre ich mit dem 'wie gesagt' vorsichtig,
aber gut, nun habe ich diese Info auch bemerkt,

einen String kann man mit einem char nicht vergleichen, auch kann man ihn nicht in int casten,
Integer.parseInt() hilft zum int,
string.equals("*") wäre ein passender Vergleich
oder string.charAt(0) == '*'
für all das das Objekt aus dem Stack immer erstmal nach String casten

grundsätzlich erscheint es akzeptabel, nur Strings im Stack zu speichern, nicht gemischt Strings/ Integer/ andere Objekte
 

Zurück
Oben