我正在尝试从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.
我该如何解决?
答案 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]]