gpt4 book ai didi

java - 类型翻译问题

转载 作者:行者123 更新时间:2023-11-30 02:39:32 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com