在 Scala 中实现 Java 接口会导致类型映射不兼容
Implementing Java interface in Scala results in incompatible type map
我有一个 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[ 的特征 ITester 中的方法 xyz java.util.Map[字符串,对象]];
方法 testComponent 具有不兼容的类型
覆盖 def testComponent(输入:java.util.Map[字符串,对象],元数据:java.util.Map[字符串,对象])
我不知道具体是什么问题。
您对 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
}
明确说明 public 方法的结果类型通常是个好主意。或者,这也应该有效:
override def testComponent(input: java.util.Map[String, Object], metadata: java.util.Map[String, Object]) =
new ArrayList[Map[String, AnyRef]]
我有一个 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[ 的特征 ITester 中的方法 xyz java.util.Map[字符串,对象]]; 方法 testComponent 具有不兼容的类型 覆盖 def testComponent(输入:java.util.Map[字符串,对象],元数据:java.util.Map[字符串,对象])
我不知道具体是什么问题。
您对 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
}
明确说明 public 方法的结果类型通常是个好主意。或者,这也应该有效:
override def testComponent(input: java.util.Map[String, Object], metadata: java.util.Map[String, Object]) =
new ArrayList[Map[String, AnyRef]]