7
votes

Scala, ne peut pas implémenter la méthode de Java générique

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)


6 commentaires

Nous devrons savoir comment clé ressemble. Parce que si j'utilise clé d'interface publique 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 serait, je n'ai pas essayé d'écrire que . L'erreur doit donc être là, d'où la question doit inclure cette information.


Quelle est la signature de type de setattributelocal ?


Ok, j'ai ajouté les informations manquantes.


3 Réponses :


4
votes

Il apparaît que le compilateur est mécontent de votre appel à setattributelocal . setattributelocal nécessite une touche [numéro] , mais vous fournissez une touche [_ <: t] . Dans Java-Land, cela signifie que vous essayez de passer une clé éteint en tant que clé .

La suggestion est d'avoir setattributelocal accepter clé ou KEULE [_ <: NUMBER] , selon qu'il soit défini Java- ou Scala.


3 commentaires

@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 alors vous pouvez regarder la mauvaise chose. L'erreur que vous avez décrite est un problème de type avec setlocalattribute , pas setattribute . Quelle est votre définition de SetLocalattribute ?


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



1
votes

Quelque chose ressemble un peu ici.

Avez-vous essayé: xxx

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 numéro à une touche de type t et que le compilateur n'est pas sûr s'il ne peut pas passer numéro pour t (lorsqu'il sait qu'il peut passer t pour numéro ).

pouvez-nous voir plus de code?


2 commentaires

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



1
votes

Comme @jsuereth déjà signalé, il y a une divergence entre les signatures de setattribute et setattributelocal , à savoir que l'ancien accepte une touche [t < : Number] mais corrige la valeur qui va avec la clé pour être exactement un numéro , 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.

Dans tous les cas, le compilateur (2.9.1) est satisfait de la configuration suivante:

MyI.JAVA < / Code>: xxx

key.java : xxx < /pree >p>Code >Test.scala: xxx


0 commentaires