У меня есть устаревший (без изменений) 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 я хочу передать список полос в держатель:
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 trait List инвариантен для типа E. Возможно, вы захотите изучить подстановочный тип, такой как
_ <: sof.Foo[_]
. (SLS 3.2.10)
новый мягкий держатель (стержни)
В качестве обходного пути я могу
val holder = new sof.Holder()
val tmpLst = holder.getLst
tmpLst.add(bar)
Работает, но ужасно. Итак, какая структура Scala подходит java.util.List<?>
?
List
в Java. Это у вас уже есть. Проблема в том, что поскольку Java не обеспечивает контроль над дисперсией,j.u.List<Bar>
не является подтипомj.u.List<Foo<?>>
. Вы можете попробовать преобразование вверх перед вызовомasJava
, что-то вроде этого должно сработать:val bars = (List(bar) : List[String]).asJava
- person Luis Miguel Mejía Suárez   schedule 05.02.2020java.util.List<?>
в вашем коде или ошибке. - person Jasper-M   schedule 05.02.2020val bars = (List(bar) : List[Foo[String]]).asJava
, потому что Bar - это Foo [String]. - person Luis Miguel Mejía Suárez   schedule 05.02.2020_ <: sof.Foo[_]
. (SLS 3.2.10) новый мягкий держатель (стержни) - person Lopotun   schedule 06.02.2020