Was fehlt mir an diesem Codeschnipsel?
%Vor%Es sagt:
Typenkonflikt: Konvertierung von Integer in N nicht möglich
Danke!
Aktualisieren Ich habe das Snippet geändert, um eine ganze Zahl zu verwenden. Das Gleiche passiert. Und das passiert auch, wenn eine anonyme Unterklasse von Number
erstellt wird. Könnte es Eclipse sein, der diesbezüglich fehlerhaft ist?
Während ein Integer eine Zahl ist, ist ein Integer möglicherweise nicht mit N kompatibel, das eine Unterklasse von Number sein kann.
Ganzzahl ist nicht garantiert eine Oberklasse von N, so dass Sie nicht einfach einen Integer-Wert auf ein Objekt vom Typ N setzen können.
Denken Sie darüber nach: Wenn jemand Zero<N>
als Zero<Double>
instanziiert, wird die Klasse effektiv zu
das ist offensichtlich nicht gültig.
Darüber hinaus können Sie return 0
auch nicht tun, da der Compiler auf die gleiche Weise nicht wissen kann, wie er ihn in N konvertiert. (Der Compiler kann nur Autobox-Typen kennen, die er kennt, aber durch Mit Generics haben Sie die verfügbaren Typen erweitert, um auch benutzerdefinierte Implementierungen von Number einzuschließen.)
Das Problem mit Ihrem Code ist, dass Java in der Lage sein muss, zu bestätigen, dass der Rückgabetyp der Funktion in N extends Number
für jede N
konvertiert werden muss. Also, insbesondere wenn ich die Klasse mit einem Double
instanziieren würde, wie in
Sie würden Probleme bekommen, weil zero
sagt, dass es ein Double
zurückgibt, aber es gibt tatsächlich ein Integer
zurück. Der Typfehler zeigt an, dass der Compiler besorgt ist, dass so etwas passieren wird.
Nach meinem besten Wissen gibt es keinen guten Weg, dies in Java zu tun, weil Generika durch Löschen implementiert werden; es kann nicht wissen, was der Typ des Arguments ist.
0 ist ein int
, aber da Ihre Methode ein Objekt zurückgibt, wird sie auf eine Integer
autoboxiert. Das Problem ist, dass die Rückgabe eines Integer
, wobei jede Unterklasse von Number erlaubt ist, vom Compiler nicht erlaubt ist. Das liegt einfach daran, dass Sie Ihre Klasse als
und in diesem Fall wäre die Rückgabe von Integer
nicht mit dem erwarteten Rückgabetyp kompatibel: Double
.
Wenn 'N' 'Nummer' erweitert, wird 'N' zu einer Spezialisierung von 'Nummer' und Sie können keine Instanz einer Basisklasse einer Referenzvariablen ihrer Spezialisierung zuweisen (Upcast-Problem). Dies gilt auch für die Rückkehr. Eine Basisklasseninstanz kann nicht mit dem Spezialisierungstyp zurückgegeben werden.