J'aimerais mettre en œuvre une méthode Java qui utilise des génériques dans Scala (2.9.2). Mais je défaisse ...
Méthode d'interface Java: p>
[error] found : mypackage.Key[T] [error] required: mypackage.Key[java.lang.Number] [error] Note: T <: java.lang.Number, but Java-defined class Key is invariant in type T. [error] You may wish to investigate a wildcard type such as `_ <: java.lang.Number`. (SLS 3.2.10) [error] setAttributeLocal(key, value)
3 Réponses :
Il apparaît que le compilateur est mécontent de votre appel à La suggestion est d'avoir setattributelocal code>.
setattributelocal code> nécessite une touche
[numéro] code>, mais vous fournissez une touche
[_ <: t] code>. Dans Java-Land, cela signifie que vous essayez de passer une clé
Étend le numéro> code> éteint en tant que clé
setattributelocal code> accepter
clé EXTENEZ NUMBER> CODE> ou
KEULE [_ <: NUMBER] CODE>, selon qu'il soit défini Java- ou Scala. P>
@Garfieldklon J'ai dû lire cela à quelques reprises ... Je pense que ce que suggère Ben, c'est que si vous êtes concentré sur la fixation setattribute code> alors vous pouvez regarder la mauvaise chose. L'erreur que vous avez décrite est un problème de type avec
setlocalattribute code>, pas
setattribute code>. Quelle est votre définition de
SetLocalattribute code>?
@Richard - D'accord, cela explique pourquoi je ne pouvais pas reproduire cela
Nous avons enfin ajouté cette solution: private def setattributelocal [t] (clé: touche [t], valeur: objet) code>
Quelque chose ressemble un peu ici.
Avez-vous essayé: p> Il semble étrange / mauvais de préserver le type T pour la clé, mais ne l'utilise pas sur la valeur. Je suppose que c'est là que vous obtenez une erreur invariante. Vous essayez d'assainger la valeur du type pouvez-nous voir plus de code? p> p> numéro code> à une touche de type
t code> et que le compilateur n'est pas sûr s'il ne peut pas passer
numéro Code> pour
t code> (lorsqu'il sait qu'il peut passer
t code> pour
numéro code>). p>
Ce n'est pas une option, car ce n'est pas une substitution.
Il existe des limitations dans les interfaces de type Java et Scala. Ce que vous faites dans Java est de type non sain, et Scala le désactive. Si vous souhaitez continuer à utiliser ce type-wizardry, vous devrez alors vous coller avec le système de type de Java, désolé.
Comme @jsuereth déjà signalé, il y a une divergence entre les signatures de Dans tous les cas, le compilateur (2.9.1) est satisfait de la configuration suivante: p> setattribute code> et
setattributelocal code>, à savoir que l'ancien accepte une touche
[t < : Number] code> mais corrige la valeur qui va avec la clé pour être exactement un numéro code> code>, alors que ce dernier est plus flexible et permet une clé et une valeur d'être
t <: / code>. Cela semble plutôt étrange et vous voudrez peut-être reconsidérer cette décision. Cela conduit également au problème expliqué par @ben Schulz.
MyI.JAVA < / Code>: strong> p>
key.java code>: strong> p>
: strong> p>
Nous devrons savoir comment
clé code> ressemble. Parce que si j'utilise
clé d'interface publique code> le code ci-dessus compile bien.
@Garfieldklon Quelle version de Scala travaillez-vous?
@ 0__ sous quelle version compile-t-il?
@RICHARD SCANAA 2.9.1, 2.9.2, 2.10.0-M6 - En effet, car je n'ai aucune idée de ce que
setattributelocal code> serait, je n'ai pas essayé d'écrire que i>. L'erreur doit donc être là, d'où la question doit inclure cette information.
Quelle est la signature de type de
setattributelocal code>?
Ok, j'ai ajouté les informations manquantes.