使用setData方法将Scala列表转换为JavaFX ObservablesList

使用setData方法将Scala列表转换为JavaFX ObservablesList,java,scala,javafx,jvm,javafx-8,Java,Scala,Javafx,Jvm,Javafx 8,我正在使用JavaFX 我有一个Scala列表中的观察列表,类型为list[(Int,Int)] 我想以某种方式将此列表转换为JavaFX setData方法可以使用的列表: import javafx.application.Application import javafx.scene.Scene import javafx.scene.chart.LineChart import javafx.scene.chart.NumberAxis import javafx.scene.chart

我正在使用JavaFX

我有一个Scala列表中的观察列表,类型为list[(Int,Int)]

我想以某种方式将此列表转换为JavaFX setData方法可以使用的列表:

import javafx.application.Application
import javafx.scene.Scene
import javafx.scene.chart.LineChart
import javafx.scene.chart.NumberAxis
import javafx.scene.chart.XYChart
import javafx.scene.layout.VBox
import javafx.stage.Stage
import javafx.collections.FXCollections
import javafx.collections.ObservableList;

// in a main class somewhere:


val series1: XYChart.Series[Number, Number] = new XYChart.Series()
series1.setName("Portfolio 1")

// this is the list of my values
val list: List[XYChart.Data[Int, Int]] = List();

// I want to convert this to an observable list that I can pass into setData
val observableList: ObservableList[XYChart.Data[Number, Number]] = FXCollections.observableArrayList(list)

series1.setData(observableList)
这会引发预期的类型错误:

found   : List[javafx.scene.chart.XYChart.Data[Int,Int]]
[error]  required: javafx.scene.chart.XYChart.Data[Number,Number]
所以我的问题是,有没有一种方法可以满足我的需求。我知道有一个getData方法,但我真的想知道如何使用setData

谢谢

TL/DR 这项工作:

import javafx.collections.{FXCollections, ObservableList}
import javafx.scene.chart.XYChart
import scala.jdk.CollectionConverters._

def convert[A <:B, B ](in: XYChart.Data[A,A]): XYChart.Data[B,B] =
  in.asInstanceOf[XYChart.Data[B, B]]

val series1: XYChart.Series[Number, Number] = new XYChart.Series()
series1.setName("Portfolio 1")

val list:  List[XYChart.Data[Integer, Integer]] = List()
// list: List[javafx.scene.chart.XYChart.Data[Integer,Integer]] = List()

val convertedList = list.map( convert[ Integer, Number ] ).asJava
//convertedList: java.util.List[javafx.scene.chart.XYChart.Data[Number,Number]] = []

val observableList: ObservableList[XYChart.Data[Number, Number]] =
  FXCollections.observableArrayList( convertedList )
//observableList: javafx.collections.ObservableList[javafx.scene.chart.XYChart.Data[Number,Number]] = []

series1.setData( observableList )
series1
//res2: javafx.scene.chart.XYChart.Series[Number,Number] = Series[Portfolio 1]
向上投射 Java的
XYChart.Data
自动转换为
XYChart.Data[Int,Int]
。虽然
java.lang.Integer
可能是
java.lang.Number
的子类,
scala.Int
不是。要使其成为一个,我们需要将每个
Int
还原为
整数

即使如此,将
X[Integer]
添加到
X[Number]
是协变的,而
XYChart.Data
是不变的。不幸的是,深入研究数据类并没有什么帮助。我们不能重写(final),它没有一个复制构造函数,仅仅提取它的值就打破了fx基于属性的方法背后的想法。所以,我们有点卡住了。但是,只要我们继续将其作为一个属性链使用,铸造在这里是相对安全的:

def convert[A <:B, B ](in: XYChart.Data[A,A]): XYChart.Data[B,B] =
  in.asInstanceOf[XYChart.Data[B, B]]

def convert[A谢谢,非常喜欢阅读说明,也学到了很多!
def convert[A <:B, B ](in: XYChart.Data[A,A]): XYChart.Data[B,B] =
  in.asInstanceOf[XYChart.Data[B, B]]