我试图在Scala中覆盖Java方法。
这是Java Class中的方法:
public void foo(List bar) {}
这是Scala中的方法:
override def foo(bar: util.List[_]) {
bar :+ "Text"
bar.add("Text")
}
两者都产生以下编译器错误:
Error:(78, 17) type mismatch;
found : String("Text")
required: _$1
bar.add("Text")
Error:(78, 13) value :+ is not a member of java.util.List[_$1]
bar:+ "Text"
如何在此列表中添加字符串?
答案 0 :(得分:4)
第一次尝试很容易解决; java.util.List
只是没有名为:+
的方法。 1
第二次尝试:我认为您遗失的是List[_]
与List[Any]
不同。 2 如果您将类型更改为{ {1}}, 3 您可以添加任何内容。
List[Any]
如果您无法更改签名,则可以进行演员。 4
def foo(bar: java.util.List[Any]): Unit = bar.add("Text")
1 如果确实这样做会很疯狂,因为你甚至无法从Java代码中调用该方法。
2 override def foo(bar: java.util.List[_]): Unit =
bar.asInstanceOf[java.util.List[Any]].add("Text")
表示未指定类型的<{1}} 。因此,例如,List[_]
可能是List
,因此bar
无法编译是件好事,因为这不会有任何意义
3 但总的来说,如果你发现自己使用List[Integer]
,你应该重新考虑你的设计。
4 但是,请记住,这很可怕。
答案 1 :(得分:0)
Scala不允许您使用未经检查的类型,您必须在此位置完全指定所有类型参数。关于:+
的错误是因为您传递的是java列表而不是scala列表。
override def foo(bar: java.util.List[String]): Unit = {
bar.add("Text")
}