scala - 在 Scala 列表中使用 'nested' 类型

标签 scala javafx-2 scalafx

我正在使用 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 列表而不是 ObservableListFXCollections.observableArrayList),因此他们可能会影响此解决方案的适用性(并且可能是定义 ListItemType 的位置)。

workWithItem 的方法签名很好,但不需要您尝试的 asInstanceOf 转换。

关于scala - 在 Scala 列表中使用 'nested' 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18744476/

相关文章:

scala - 为什么我不能在 Scala 中增加?

windows - Jruby:将 Pry 与 JRuby(和 JRubyFx)一起使用

ScalaFx:具有一流功能的事件处理程序

java - TableView -fx-text-fill 行

Scala、GUI 和不变性

java - Scalafx动画计时器导致递归: Possible to avoid that?

scala不喜欢akka中的自变量?

algorithm - 基于算法的大小写匹配字符串。我应该使用哪种算法?

scala - scala 2.10 的 spark 1.6 中奇怪的隐式转换问题

java - 在 JavaFX Controller 中获取被单击对象的 ID 的更好方法