La mise en œuvre de l'interface Java en Scala incompatibles type de carte

0

La question

J'ai une interface Java que je veux mettre en Scala. L'interface contient les éléments suivants de la méthode de déclaration:

 List<Map<String, Object>> xyz(Map<String, Object> var1, Map<String, Object> var2);

Mon Scala de mise en œuvre est:

override def testComponent( input: java.util.Map[String, Object], metadata: java.util.Map[String, Object] )
  {

    val list: util.List[Map[String, AnyRef]] = new util.ArrayList[Map[String, AnyRef]]

     return list
  }

ERREUR : la méthode de remplacement xyz trait ITester de type (1$x: java.util.Carte[String,Object], x$2: java.util.Carte[String,Object])java.util.Liste[java.util.Carte[String,Object]]; méthode testComponent a de type incompatible override def testComponent( entrée: java.util.Carte[String, Object], les métadonnées: java.util.Carte[String, Object] )

Je ne sais pas ce qu'est exactement le problème est.

interface java scala scala-java-interop
2021-11-20 13:48:55
1

La meilleure réponse

3

Votre définition de testComponent a type Unit parce qu'il est défini à l'aide de l' (déconseillé dans les versions récentes de la Scala) procédure de syntaxe def name(args) { } (c'est à dire aucune = {). Il passe d'abord compilation car Scala permet d'attribuer une valeur à rejetées lors de la Unit il est prévu (ce comportement peut être fait d'un avertissement avec l'option de compilateur -Ywarn-value-discard). Vous pouvez résoudre ce problème en étant explicite que vous souhaitez que cette méthode doit être appelée pour valeur en incluant la =.

override def testComponent(input: java.util.Map[String, Object], metadata: java.util.Map[String, Object]) = {
  val list: util.List[Map[String, AnyRef]] = new util.ArrayList[Map[String, AnyRef]]
  list  // return should be avoided in Scala: it's not necessary and can introduce some really subtle bugs
}

Il est généralement une bonne idée d'être explicite sur le type de résultat d'une méthode publique. Sinon, cela devrait aussi fonctionner:

override def testComponent(input: java.util.Map[String, Object], metadata: java.util.Map[String, Object]) =
  new ArrayList[Map[String, AnyRef]]
2021-11-22 00:21:31

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................