A implementação da interface Java em Scala resultados incompatíveis mapa do tipo

0

Pergunta

Eu tenho uma interface Java que eu quero implementar em Scala. A interface contém o método seguinte declaração:

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

Meu Scala implementação é:

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
  }

ERRO : substituir o método xyz no traço ITester do tipo (x$1: java.util.Mapa[String,Object], x$2: java.util.Mapa[String,Object])java.util.Lista[java.util.Mapa[String,Object]]; método testComponent tem incompatível tipo de override def testComponent( entrada: java.util.Mapa[String, Object], metadados: java.util.Mapa[String, Object] )

Eu não sei o que exatamente é o problema.

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

Melhor resposta

3

Sua definição de testComponent tem tipo Unit porque é definido usando-se o (descontinuado em versões recentes do Scala) sintaxe do procedimento de def name(args) { } (i.e. não = {). Ele primeiro passa a compilação porque Scala permite que um valor a ser descartado quando Unit é esperado que o comportamento pode ser feito um aviso com a opção de compilador -Ywarn-value-discard). Você pode resolver isso de serem explícitas que você deseja que este método a ser chamado de valor, incluindo o =.

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
}

É geralmente uma boa idéia para ser explícito sobre o tipo de resultado de um método público. Alternativamente, isso também deve funcionar:

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

Em outros idiomas

Esta página está em outros idiomas

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