scala与java的互操作,但java定义的特征列表在类型E中是不变的

scala与java的互操作,但java定义的特征列表在类型E中是不变的,java,scala,Java,Scala,我试图从scala返回继承的java类型 ... Java定义的特征列表在类型E中是不变的 Java代码: public interface Foo { .... } public class Bar implements Foo { .... } public interface FooReader { List<Foo> getFoos() throws Exception; } import scala.collection.JavaConverters._ class

我试图从scala返回继承的java类型 ... Java定义的特征列表在类型E中是不变的

Java代码:

public interface Foo {
....
}
public class Bar implements Foo {
....
}
public interface FooReader {
  List<Foo> getFoos() throws Exception;
}
import scala.collection.JavaConverters._
class Buz extends FooReader {
def getFoos: util.List[Foo] = {
val foos = List(new Bar).asjava
foos
}
}
这不会编译:


[错误]注意:BarType
java.util.List
是不变的。签名

public interface List<E> extends Collection<E>


由于Foo是Bar的一个子类型,您甚至不需要键入cast,您只需告诉list您将Foo作为Bar传递:

val foos=List(新条:Foo).asJava

如果您不是以内联方式初始化列表,因为不可变的scala列表在其类型参数中是协变的,您可以执行以下操作:

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

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