Java und Generika. Ist 0 keine Nummer?

8

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?

    
Ionuț G. Stan 25.07.2011, 22:05
quelle

5 Antworten

13

Während ein Integer eine Zahl ist, ist ein Integer möglicherweise nicht mit N kompatibel, das eine Unterklasse von Number sein kann.

    
Christopher Oezbek 25.07.2011, 22:11
quelle
12

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

%Vor%

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.)

    
Reverend Gonzo 25.07.2011 22:11
quelle
2

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

%Vor%

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.

    
templatetypedef 25.07.2011 22:12
quelle
1

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

instanziieren können %Vor%

und in diesem Fall wäre die Rückgabe von Integer nicht mit dem erwarteten Rückgabetyp kompatibel: Double .

    
Costi Ciudatu 25.07.2011 22:12
quelle
1

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.

    
srkavin 25.07.2011 22:17
quelle

Tags und Links