如何将 Scala List[String] 转换为遗留 Java List<?>
How to convert Scala List[String] to legacy Java List<?>
我有遗产(不允许修改)Java代码:
//File Foo.java
package sof;
public interface Foo<T> {}
//File Bar.java
package sof;
public class Bar implements Foo<String> {}
//File Holder.java
package sof;
import java.util.List;
public class Holder {
private List<Foo<?>> lst;
public Holder() {}
public Holder(List<Foo<?>> lst) {this.lst = lst;}
public List<Foo<?>> getLst() {return lst;}
public void setLst(List<Foo<?>> lst) {this.lst = lst;}
}
现在,在我的 Scala 代码中,我想将 bars 的列表传递给 holder:
import sof._
import collection.JavaConverters._
val bar = new Bar()
val bars: java.util.List[Bar] = List(bar).asJava
val holder = new sof.Holder(bars)
它不会编译。错误是:
Error:(37, 18) type mismatch; found : java.util.List[sof.Bar]
required: java.util.List[sof.Foo[_]] Note: sof.Bar <: sof.Foo[_], but
Java-defined trait List is invariant in type E. You may wish to
investigate a wildcard type such as _ <: sof.Foo[_]
. (SLS 3.2.10)
new sof.Holder(bars)
作为解决方法,我可以
val holder = new sof.Holder()
val tmpLst = holder.getLst
tmpLst.add(bar)
它有效,但很糟糕。
那么,符合java.util.List<?>
的Scala结构是什么?
Java 想要 java.util.List<Foo<?>>
但你给了它 java.util.List<Bar>
。 Java 不支持 List
方差,所以这不起作用。
您需要为其提供所需的实际类型:
val bar = new Bar()
val foos: List[Foo[_]] = List(bar)
val holder = new sof.Holder(foos.asJava)
我有遗产(不允许修改)Java代码:
//File Foo.java
package sof;
public interface Foo<T> {}
//File Bar.java
package sof;
public class Bar implements Foo<String> {}
//File Holder.java
package sof;
import java.util.List;
public class Holder {
private List<Foo<?>> lst;
public Holder() {}
public Holder(List<Foo<?>> lst) {this.lst = lst;}
public List<Foo<?>> getLst() {return lst;}
public void setLst(List<Foo<?>> lst) {this.lst = lst;}
}
现在,在我的 Scala 代码中,我想将 bars 的列表传递给 holder:
import sof._
import collection.JavaConverters._
val bar = new Bar()
val bars: java.util.List[Bar] = List(bar).asJava
val holder = new sof.Holder(bars)
它不会编译。错误是:
Error:(37, 18) type mismatch; found : java.util.List[sof.Bar] required: java.util.List[sof.Foo[_]] Note: sof.Bar <: sof.Foo[_], but Java-defined trait List is invariant in type E. You may wish to investigate a wildcard type such as
_ <: sof.Foo[_]
. (SLS 3.2.10)
new sof.Holder(bars)
作为解决方法,我可以
val holder = new sof.Holder()
val tmpLst = holder.getLst
tmpLst.add(bar)
它有效,但很糟糕。
那么,符合java.util.List<?>
的Scala结构是什么?
Java 想要 java.util.List<Foo<?>>
但你给了它 java.util.List<Bar>
。 Java 不支持 List
方差,所以这不起作用。
您需要为其提供所需的实际类型:
val bar = new Bar()
val foos: List[Foo[_]] = List(bar)
val holder = new sof.Holder(foos.asJava)