interop scala with java获取但Java定义的特征列表在类型E中是不变的

时间:2015-11-08 13:41:48

标签: java scala

我正在尝试从scala返回继承的java类型,而我正在获取 ... Java定义的特征列表在类型E中是不变的

Java代码:

public interface Foo {
....
}
public class Bar implements Foo {
....
}
public interface FooReader {
  List<Foo> getFoos() throws Exception;
}

Scala代码:

import scala.collection.JavaConverters._
class Buz extends FooReader {
def getFoos: util.List[Foo] = {
val foos = List(new Bar).asjava
foos
}
}

这不会编译:

  

[ERROR]注意:Bar&lt ;: Foo,但Java定义的特征列表是不变的   输入E.

我该如何解决?

2 个答案:

答案 0 :(得分:4)

由于Foo是Bar的子类型,你甚至不需要输入强制类型,你只需告诉列表你将Foo作为Bar传递:

val foos = List(new Bar:Foo).asJava

如果你没有内联列表,因为不可变的scala列表在其类型参数中是协变的,你可以这样做:

val foos =(listOfBars:List [Foo])。asJava

答案 1 :(得分:1)

类型java.util.List是不变的。签名,

public interface List<E> extends Collection<E>

你可以通过类型转换使其工作,

val foos = List(new Bar().asInstanceOf[Foo]).asJava

val foos = List(new Bar(x=2)).asJava.asInstanceOf[java.util.List[Foo]]