【发布时间】:2020-05-21 07:42:08
【问题描述】:
我有旧版(不允许修改)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)
它不会编译。错误是:
错误:(37, 18) 类型不匹配;找到:java.util.List[sof.Bar] 必需:java.util.List[sof.Foo[_]] 注意:sof.Bar <: sof.foo java e>_ <: sof.Foo[_]。 (SLS 3.2.10)
新的sof.Holder(条)
作为一种解决方法,我可以
val holder = new sof.Holder()
val tmpLst = holder.getLst
tmpLst.add(bar)
它有效,但很糟糕。
那么,适合 java.util.List<?> 的 Scala 结构是什么?
【问题讨论】:
-
问题在于没有将 Scala
List转换为 Java 之一。你已经有了。问题在于,因为 Java 不提供对 variance 的控制,所以j.u.List<Bar>不是j.u.List<Foo<?>>的子类型。您可以在调用asJava之前尝试向上转换,这样的东西应该可以工作:val bars = (List(bar) : List[String]).asJava -
您的代码或错误中没有任何
java.util.List<?>。 -
@LuisMiguelMejíaSuárez 不幸的是,它以“无法将 List[Bar] 向上转换为 List[String]”而告终。是的,这是有道理的:确实,Bar 列表不是 String 列表。
-
@Lopotun O,抱歉打错了,我在手机上。应该是
val bars = (List(bar) : List[Foo[String]]).asJava因为 Bar 是 Foo[String]。 -
@Jasper-M 恐怕我不太明白你的回答。给定的 Java 代码是旧代码,我无法更改。
标签: java scala generics bounded-wildcard