Was sind die Ursachen der "Inkompatiblen Operanden-Typen" Fehler?
Bin ich versucht zu implementieren iSortableStack Interface durch eine Klasse.
Hier ist meine main-Funktion,
public class SampleStack<E> {
E ch;
@SuppressWarnings("unchecked")
public static void main(String[] args) throws IOException {
ISortableStack<Character> s = new SortableStack<Character>();
SampleStack demo = new SampleStack();
while ((demo.ch == System.in.read()) != '\n')
if (!s.isFull())
s.push((Character) demo.ch);
while (!s.isEmpty())
System.out.print(s.pop());
System.out.println();
}
}
Aber ich bin immer ein Fehler auf dieser Linie,
while ((demo.ch == System.in.read()) != '\n')
Fehler : Inkompatible Operanden-Typen Object und int
Was ist hier falsch ?
und wenn Sie erklären demo als
Anstatt unterdrücken von Warnungen (wie Sie getan haben, mit der
Was genau ist ein stack sortierbar, andere als ein Widerspruch in sich?
SampleStack<Character>
?Anstatt unterdrücken von Warnungen (wie Sie getan haben, mit der
@SuppressWarnings("unchecked")
), die Sie beherzigen sollten compiler-Beratung. Wenn Sie nicht verstehen, dass die Beratung, dann sollten Sie Lesen-bis Sie (das ist, was Sie tun, indem Sie Fragen hier, eine ausgezeichnete Wahl.) Im Allgemeinen: keine Warnungen ignorieren, es sei denn, Sie wissen, was Sie bedeuten.Was genau ist ein stack sortierbar, andere als ein Widerspruch in sich?
InformationsquelleAutor alan | 2011-08-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei schwerwiegende Probleme hier, die haben nichts zu tun mit Generika.
Zunächst
demo.ch == System.in.read()
ist einboolean
Ausdruck. Das Ergebnisread()
(int
) auto-Box zu einemInteger
, und die Identität des Objekts wird geprüftdemo.ch
(das istnull
).Ich denke, dass das, was Sie hier wollen, ist der Zuweisungsoperator,
=
. Dies wird ordnen Sie dieread()
Ergebnis zudemo.ch
.Das nächste problem ist, dass es aussieht, wie Sie erwarten, dass
demo.ch
eineCharacter
(bezogen auf die Modelle, die Sie verwenden). Aber Sie versuchen, zuweisen einerint
(das Ergebnisread()
). Primitive Typen werden kann die "auto-boxed" wenn nötig, das heißt, Sie kann umgewandelt werden in ein wrapper-Objekt wieCharacter
oderInteger
, aber nur, wenn der Wert umgewandelt werden, ist ein konstanter Ausdruck, der dargestellt werden kann durch die Ziel-Typ. Hier, der Wert ist variabel, so dass die Konvertierung nicht durchgeführt werden implizit.Könnte man dies umgehen, indem Sie explizit casting der
read()
Ergebnis einerchar
, und dann lassen Sie die auto-Boxen wandeln Sie es in einCharacter
, aber das würde ausblenden, EOF, dargestellt durch einen Wert von -1. Ich empfehlen, mit so etwas wie dies:Beachten Sie, dass wir nicht verwenden
demo
hier an alle, die Probleme mit Ihrem Typ-parameter sind irrelevant.Character c; c = (int) 3;
ist in der Tat definiert und funktioniert bestens. Der rest von dem, was Sie sagen, ist der sound jedoch vor allem über die Gefahren von autoboxing das Ergebnis von Lesen (), um eineCharacter
.Friedman-Hill: Das ist interessant, ich wusste gar nicht, dass, und ich immer noch nicht vollständig verstehen, was dort passiert. Es scheint, dass diese Zuweisung funktioniert nur, wenn es die
int
rvalue kann statisch bestimmt, um sich in einechar
ohne Verengung. Zum Beispielc = (int) -1
undc = (int) 65536
funktionieren nicht. Auch die Analyse ist lokal;int i = 3; c = i;
funktioniert nicht in diesem Fall. Weißt du, wo dies ist in der JLS?Ich denke, das ist Gegenstand der Diskussion in Abschnitt 5.2, Zuweisung Konvertierung: "A narrowing primitive conversion kann verwendet werden, wenn die variable den Typ byte, short oder char, und der Wert der Konstante Ausdruck darstellbar ist, in den Typ der Variablen."
Dass auf jeden Fall deckt es! Vielen Dank für die Referenz.
InformationsquelleAutor erickson
SampleStack.ch
ist der TypE
.E
ist ein Objekt spezifiziert die Art Ihrer Parameter. Da Sie nicht angeben, einen Typ-parameter, der compiler legtObject
für Sie. Wenn Sie wolltech
eineCharacter
möchten SieSampleStack<Character> demo = new SampleStack<Character>();
oder in Java 7SampleStack<Character> demo = new SampleStack<>();
.InformationsquelleAutor Jeffrey
Du noch keinen Typ-parameter beim instanziieren
SampleStack
, sodemo.ch
ist der TypObject
. Das kann natürlich nicht verglichen werden (oder zugeordnet ist, das ist, was ich vermute, Sie wollte eigentlich zu tun sowieso), von derint
ausSystem.in
.InformationsquelleAutor Ernest Friedman-Hill
Haben Sie
==
(equality test), wenn Sie wollen=
(Abtretung). Sie sind eigentlich nie die Zuordnung zudemo.ch
. Die Gleichheit testen returns boolean, anstatt char, daher die Fehlermeldung.Werden Sie auch brauchen, um die Besetzung das Ergebnis von
System.in.read()
zu einem Zeichen von einem integer (oder anderes verwendenSampleStack<Integer>
oder so ähnlich.)InformationsquelleAutor George Armhold
Haben Sie mehrere Fehler in diesem code:
so Leute wies darauf hin, Sie machen eine generische Klasse, aber du bist nicht verallgemeinern es und verwenden Sie es roh, benötigen Sie:
SampleStack<Character>
selbst wenn Sie es ändern, es wird nicht ausgeführt, als du == statt =
sogar wenn du die beiden oben genannten nicht funktionieren als System.in.read() liefert einen int, nicht ein Zeichen, Sie sollten entweder machen ein stack von Ganzzahlen ODER Lesen Sie den Wert aus der Eingabe in eine variable und dann warf er, sondern seine nicht eine gute Praxis. Ich würde einen Scanner oder somethign ähnlich zu Lesen, was der Benutzer eingibt, wie diese:
Scanner sc = new Scanner(System.in);
char c = sc.nextChar();
InformationsquelleAutor Mateusz Dymczyk