trouvé Unité: nécessaire Int. Pourquoi l'erreur est-elle pas évidente?
J'ai une méthode qui est censée retourner un Int. Je suis en train d'essayer de comprendre pourquoi Eclipse ne me permet pas de compiler ce, même s'il semble évident pour moi à l'intérieur de l'instruction if qui je suis, en effet, en retournant un Int. Est-il quelque chose que je suis absent de très évident? Je suis en train d'essayer de comprendre cet aspect de la Scala avant de procéder à écrire plus de code.
Voici la méthode:
def contains1(sfType: TokenType): Int = {
if (Tokens.KEYWORDS.contains(sfType)) {
val retVal = TokenTypes.RESERVED_WORD
}
}
Eclipse se plaint sur la ligne 2 --- 'incompatibilité de type; trouvé : Unité requis: Int"
TokenTypes is - public abstract interface org.fife.ui.rsyntaxtextarea.TokenTypes and RESERVED_WORD is - public static final int RESERVED_WORD = 6;
J'ai lu ce post ici: trouvé: Unité requis: Int - Comment remédier à cela? et essayé de résoudre le problème avant de le poster, mais je suis toujours à perte.
Edit: La méthode est censée retourner un Int et que j'avais tapé dans le type de retour à tort. Mon problème reste le même. Eclipse se plaint toujours.
- Qu'est-ce que la ligne 2, qu'est-ce que les mots clés.
- Je suis confus. Dites-vous que
contains1
doit retourner un Int, ouTokens.KEYWORDS.contains()
? - contains1 doit retourner un Int
- KEYWWORDS est "final val RESERVED_WORD: Int" . C'est un domaine public final class TokenTypes
- Puisque vous le dire explicitement le contains1 renvoie l'Unité, il n'y aura pas de valeur de retour.
- double possible de Scala: incompatibilité de type; trouvé : Unité requis: Boolean
- Aussi, ce n'est pas tout à fait un doublon. Merci de ne pas voter pour le fermer. Les autres situation est aussi une 1 sur pattes, si, mais il n'a pas essayer cette "retVal" choses".
- 1. La cession est de type Unitaire. L'affectation d'une valeur à
retVal
. Vous pouvez le vérifier dans le repl: scala> val test = {val retVal = 1} test: Unit = () 2. Qu'attendez-vous de la fonction de retour dans le cas où si votre déclaration n'est pas le garder? Comment cette fonction le sais?
Vous devez vous connecter pour publier un commentaire.
Je vais d'abord expliquer ce type de
Unit
est, juste au cas où. Même si vous connaissez déjà, d'autres personnes ont le même genre de problème pourrait bien ne pas le savoir.Type
Unit
est similaire à ce qui est connu dans le C ou le Java commevoid
. Dans ces langues, ce qui signifie "ce ne retourne rien". Cependant, chaque méthode dans Scala renvoie une valeur.À combler le fossé entre chaque méthode retournant quelque chose et de ne pas avoir quelque chose d'utile pour le retour, il y a
Unit
. Ce type est unAnyVal
, ce qui signifie qu'il n'est pas alloué sur le tas, à moins qu'il obtient en boîte ou est le type d'un champ sur un objet. En outre, il a seulement un valeur, dont le littéral est()
. Qui est, vous pouvez écrire ceci:L'effet pratique de cette est que, lorsqu'une méthode "renvoie"
Unit
, le compilateur n'a pas réellement besoin de renvoyer une valeur, puisqu'il sait déjà ce que la valeur des autres. Par conséquent, il peut mettre en œuvre des méthodes de retourUnit
en les déclarant, sur le bytecode niveau, commevoid
.De toute façon, si vous ne voulez pas rentrer quoi que ce soit, vous revenez
Unit
.Maintenant, regardons le code donné. Eclipse dit qu'elle renvoie
Unit
, et, en fait, Eclipse est correct. Cependant, la plupart des gens serait effectivement faire l'erreur d'avoir ce genre de retour de méthodeAnyVal
ouAny
, pasUnit
. Voir l'extrait de code suivant pour un exemple:Donc, ce qui s'est passé? Ainsi, lors de la Scala trouve un
if
déclaration, il doit déterminer quel est le type retourné par elle (en Scala,if
états valeurs de retour en tant que bien). Considérez les points suivants hypothétique ligne:Clairement, la valeur retournée sera soit
x
ouy
, de sorte que le type doit être telle que les deuxx
ety
sera adaptée. Un exemple type estAny
, depuis tout a typeAny
. Si les deuxx
ety
étaient de même type, disons,Int
-- alors ce serait aussi un type de retour valide. Depuis Scala choisit le plus spécifique de type, il allait chercherInt
surAny
.Maintenant, ce qui se passe quand vous ne pas ont un
else
déclaration? Même en l'absence d'unelse
instruction, la condition peut être faux, sinon, il n'y aurait pas d'intérêt à utiliserif
. Ce que Scala fait, dans ce cas, est de ajouter unelse
déclaration. C'est, il réécrit queif
déclaration comme ceci:Comme je l'ai dit auparavant: si vous n'avez rien à retourner,
Unit
! C'est exactement ce qui se passe. Depuis deuxInt
etUnit
sontAnyVal
, et étant donné queAnyVal
est plus spécifique queAny
, qui retourneAnyVal
.Jusqu'à présent, j'ai expliqué ce que les autres pourrait ont vu, mais pas ce qui se passe en ce que le code spécifique à la question:
Nous avons déjà vu que la Scala va réécrire comme ceci:
Nous avons aussi vu que la Scala va choisir le plus spécifique de type entre les deux résultats possibles. Enfin, Eclipse indique à utiliser que le type de retour est
Unit
, de sorte que la seule explication possible est que le type de ce:est également
Unit
. Et c'est précisément correct: les déclarations qui déclarent des choses dans la Scala de typeUnit
. Et, donc, par la manière, faire les devoirs.La solution, comme d'autres l'ont souligné, est de supprimer l'affectation et ajouter un
else
relevé de retour d'unInt
:(note: j'ai reformaté la méthode à suivre, le style de codage plus fréquente chez Scala programmeurs)
J'ai le sentiment que vous avez besoin de changer votre méthode de ressembler à l'une des opérations suivantes
En scala, il n'y a pas
if
déclarationDepuis chaque expression évaluée doit retourner une valeur (il peut être une valeur vide, de type
Unit
), leif
expression doit toujours être mise en correspondance avec uneelse
de la branche, et les deux doivent retourner le même type, ou, dans le pire des cas scala va conclure le plus commun supertype.Dans votre code, vous retourner un
Int
de laif
branche, mais leelse
branche est manquant.mis à jour
Comme indiqué correctement dans d'autres réponses:
le seul
if
expression renvoie la seule alternative à l'intérieur, ce qui pour le post original est la valeur de retour d'une mission, qui est()
de typeUnit
Eclipse pense que si le bloc "if" est faux, j'.e,
Tokens.KEYWORDS.contains(sfType)
estfalse
, puis le type de retour sera en effetUnit
, qui est le problème.