我正在使用 ScalaFX 和 JavaFX,并且有以下代码:
import scalafx.Includes._
class Type1(anInt: Int, ...)
class Type2(aString: String, ...)
class ListItem[T](internalValue:T, ...)
object Worker
{
val list1 = FXCollections.observableArrayList[ListItem[Type1]]()
val list2 = FXCollections.observableArrayList[ListItem[Type2]]()
def workWithList(list:ObservableList[ListItemType]) {
list.foreach(i => workWithItem(i))
}
def workWithItem(item:ListItem) {
item match {
case i:ListItem[Type1] => do something
case i:ListItem[Type2] => do something else
}
}
workWithList(list1)
workWithList(list2)
}
我的问题是这段代码无法编译;它说我不能将 ObservableList[ListItem[Type1]] 用于 workWithList
方法,该方法需要 ObservableList[ListItem]。
正如我一直在研究的那样,此代码的某些变体表示存在未经检查的警告,并且由于类型删除,模式匹配将不起作用。
理想情况下:
- 只有一个列表可以容纳 ListItem[Type1] 和 ListItem[Type2] 类型的对象
- 在处理项目时,我可以进行模式匹配,以根据正在处理的项目类型执行不同的操作
workWithItem
可以使用任一类型的项目。在我当前的代码中,我必须将签名更改为workWithItem(item:ListItem[_])
,然后执行workWithItem(someItem.asInstanceOf[ListItem[_]])
。可能不是正确的做法!
谢谢!
最佳答案
workWithList 的方法签名看起来错误 - ListItemType
类型从何而来?这应该是 def workWithList(list: ObservableList[ListItem[_]]) { ...
吗?
如果是这样,那么您在匹配案例中将遇到的问题是,由于类型删除,JVM 无法在运行时区分案例的类型签名之间的差异。例如,可以通过将 Type1、Type2 和 ListItem 转换为案例类(或手动为它们生成 unapply 方法),然后解构匹配案例中的项目来解决此问题,如下所示:
case class Type1(anInt: Int)
case class Type2(aString: String)
case class ListItem[T](internalValue:T)
object Worker
{
val list1 = FXCollections.observableArrayList[ListItem[Type1]]()
val list2 = FXCollections.observableArrayList[ListItem[Type2]]()
def workWithList(list: ObservableList[ListItem[_]]) {
list.foreach(i => workWithItem(i))
}
def workWithItem(item: ListItem[_]) {
item match {
case ListItem(i: Type1) => println(s"Have type 1: ${i.anInt}") //do something
case ListItem(i: Type2) => println(s"Have type 2: ${i.aString}") //do something else
case anythingElse => println(s"Unknown type: $anythingElse") //just as a safe default for now
}
}
workWithList(list1)
workWithList(list2)
}
请注意,我在这里工作时对 FX 库没有具体的了解(我尝试使用直接的 scala 列表而不是 ObservableList
或 FXCollections.observableArrayList
),因此他们可能会影响此解决方案的适用性(并且可能是定义 ListItemType
的位置)。
workWithItem 的方法签名很好,但不需要您尝试的 asInstanceOf
转换。
关于scala - 在 Scala 列表中使用 'nested' 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18744476/