9
votes

Java et génériques. N'est-ce pas 0 un numéro?

Qu'est-ce qui me manque sur cet extrait de code? XXX

Il est écrit:

MisMatch de type: impossible de convertir de l'entier en n

Merci!

Mise à jour J'ai changé l'extrait pour utiliser un entier. La même chose arrive. Et cela arrive même lors de la création d'une sous-classe anonyme de numéro . Pourrait-il être éclipse qui est défectueuse à ce sujet?


2 commentaires

Essayez Integer.Valueof (0) , on dirait que vous avez trouvé un autre "cas spécial" pour autoboxing-autounboxing et génériques.


0 est un numéro , mais ce n'est pas nécessairement un n


5 Réponses :


14
votes

Bien qu'un entier est un nombre, un entier peut ne pas être compatible avec N, ce qui peut être n'importe quelle sous-classe de nombre.


2 commentaires

Hmm, tu as raison. Si le code utilisateur à N délimite BigDecimal , je ne peux pas retourner un Entier . Il n'a clairement pas la bonne interface.


Je vais simplement retourner la signature de la méthode zéro pour renvoyer Number un élimination de la variable de type n . Il s'avère que c'est assez à mes besoins. Ici, c'est si vous êtes curieux: gist.github.com/1105403



13
votes

Entier n'est pas garanti d'être une superclasse de N. Vous ne pouvez donc pas simplement définir une valeur entière à un objet de type N.

Pensez-y de cette façon: Si quelqu'un instance zéro comme zéro , la classe devient efficacement: xxx

qui n'est évidemment pas valide.

En outre, vous ne pouvez pas faire retour 0 soit, car de la même manière, le compilateur ne peut pas le convertir en N. (le compilateur ne peut que des types d'autoboxe qu'il connaît environ , mais en utilisant des génériques, vous avez élargi les types disponibles pour inclure également des implémentations personnalisées de nombre.)


2 commentaires

"Entier n'est pas garanti d'être une superclasse de n"? Je suis sûr que vous vouliez dire autre chose, comme si integer était une superclasse de N, il rendrait le code encore "moins compilable", comme vous ne pouvez pas retourner une superclasse de n à partir d'une méthode qui déclare son type de retour comme n .


Merci pour votre réponse. J'ai accepté la réponse de Christopher parce qu'il était le premier qui lui a rendu clair (pour moi) quel était le problème.



1
votes

0 est un int , mais puisque votre méthode renvoie un objet, il sera autoboxé sur un entier . Le problème est que le retour d'un entier toute sous-classe de numéro de numéro est autorisé n'est pas autorisé par le compilateur. C'est simplement parce que vous pouvez instancier votre classe comme xxx

et dans ce cas, retourner entier ne serait pas compatible avec le type de retour attendu: double .


0 commentaires

2
votes

Le problème avec votre code est que Java doit être capable de confirmer que le type de retour de la fonction doit être convertible vers N étend le numéro pour tout n . Donc, en particulier, si je devais instancier la classe avec un double , comme dans xxx

vous rencontrez des ennuis, car zéro dit qu'il renvoie un double mais cela renvoie réellement un entier . L'erreur de type indique que le compilateur est préoccupé par le fait que quelque chose comme celui-ci se produira.

au meilleur de ma connaissance, il n'y a pas de bon moyen de le faire en Java car les génériques sont mis en œuvre via Erasure; Il ne peut pas savoir quel est le type de l'argument.


0 commentaires

1
votes

Quand "N" étend "N °", "N" devient une spécialisation du "numéro" et vous ne pouvez pas attribuer une instance d'une classe de base à une variable de référence de sa spécialisation (éventuelle émission). Cela tient bien tout en revenant également. Une instance de classe de base ne peut pas être renvoyée à l'aide du type de spécialisation.


0 commentaires