java - 类型翻译问题

标签 java scala types

我在 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/

相关文章:

scala - 如何将 Spark 数据帧列从 Array[Int] 转换为 linalg.Vector?

scala - 用不可变对象(immutable对象)模拟继承+可变状态

具有特定深度的 TypeScript 递归类型

c# - 为什么我应该在 C# 中使用 int 而不是 byte 或 short

java - Homebrew如何在更新JDK后自动更新JAVA_HOME?

java - 如何用方程要求解决这个 3x3 矩阵

java - 如何理解pdf表单标志?

java - ArrayList 的初始化和修改

scala - 在 Scala 中对 mixin 成员的封装

C++ 原始数据类型 : how to read unsigned 30 bits