我在 Java 中的类层次结构下面有这个
Class Container
{
private List<? extends Element> element;
public List<? extends Element> getElements()
{
return elements;
}
public void setElements(List<? extends Element> elements)
{
this.elements = elements;
}
}
MyElement extends Element
{
int a;
}
在我的 scala 服务中,我使用这些类如下 -
var elements: java.util.List[_ <: Element] = container getElements
elements match {
case null => elements = new ArrayList[MyElement]();
case _ => ;
}
//additional service code here,
//and then try to create an object and add it to the existing list of elements as below.
val element = new MyElement
//..... other prog logic..
elements.add(element)
将元素添加到列表时出现编译错误
我看到错误消息列为 -
type mismatch; found : element.type (with underlying type com.vo.MyElement) required: _$7 where type _$7 <: com.vo.Element
有什么办法可以解决这个问题吗?为什么 Scala 编译器无法破译 MyElement 确实是 Element 的子类并且可以添加到主列表中。
真心希望有人能帮助我。我尝试了几种替代方法,但就是无法使其正常工作。我错过了什么还是我真的很蠢?
谢谢, 阿达什
最佳答案
如果您在 Java 中尝试过此操作,您也会遇到同样的问题(可能只是一条更有用的错误消息......)。
看一下下面的代码,想想如果编译它会发生什么。
trait Element
class MyElement extends Element
class MyOtherElement extends Element
import java.{ util => ju }
val myElements = new ju.ArrayList[MyElement]()
val elements: ju.List[_ <: Element] = myElements
elements.add(new MyOtherElement)
val myElement: MyElement = myElements.get(0)
顺便说一句,这与 Java 和 Scala 无关:
import scala.collection.mutable.ListBuffer
val myElements = new ListBuffer[MyElement]()
val elements: ListBuffer[_ <: Element] = myElements
elements += new MyOtherElement
val myElement: MyElement = myElements(0)
原因是您正在使用 use-site variance在这里,因为可变集合被定义为不变的。所有 Java 集合都自动保持不变,因为 Java 没有像 Scala 那样的声明位置差异的概念,而且它的集合无论如何都是可变的。
关于java - 类型翻译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42138793/