将字符串添加到util.List [_]

时间:2015-06-24 19:31:54

标签: scala

我试图在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"

如何在此列表中添加字符串?

2 个答案:

答案 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") 
}