在Scala中实现Java接口会导致不兼容的类型映射



我有一个Java接口,我想在Scala中实现它。该接口包含以下方法声明:

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

我的Scala实现是:

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
}

错误:重写类型为(x$1:java.util.Map[String,Object],x$2:java.util_Map[String,Object](java.util.List[java.util.Map[String、Object]]的特征ITester中的方法xyz;方法testComponent具有不兼容的类型override-def-testComponent(输入:java.util.Map[String,Object],元数据:java.util_Map[String,Object](

我不知道到底是什么问题。

您对testComponent的定义具有Unit类型,因为它是使用def name(args) { }(即没有= {(的过程语法(在Scala的最新版本中已弃用(定义的。它首先通过编译,因为Scala允许在预期Unit时丢弃一个值(编译器选项-Ywarn-value-discard可以使该行为成为警告(。您可以通过明确表示希望通过包含=来调用此方法以获取值来解决此问题。

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
}

明确公共方法的结果类型通常是个好主意。或者,这也应该起作用:

override def testComponent(input: java.util.Map[String, Object], metadata: java.util.Map[String, Object]) =
new ArrayList[Map[String, AnyRef]]

最新更新