scala - 奇怪的类型不匹配错误

标签 scala javafx scalafx

我在 TableView[Error] 中有一个类型为 TableColumn[Error, Boolean] 的表列 errorFixed。我的 Error 类有一个 val fixed: Boolean,我试图将其放入此表列中。

我试过了

errorFixed.cellValueFactory = features => 
  ReadOnlyBooleanWrapper(features.value.fixed)

但它失败了

type mismatch;
found   : scalafx.beans.property.ReadOnlyBooleanWrapper
required: scalafx.beans.value.ObservableValue[Boolean,Boolean]

我真的不明白 ObservableValue[Boolean,Boolean]ReadOnlyBooleanWrapper 的父类(super class)型 according to the documentation .

如果我自己使用 .asInstanceOf[ObservableValue[Boolean, Boolean]] 转换它似乎有效。这是怎么回事?

Gist with stripped down project to reproduce

最佳答案

简短的回答是:而不是

errorFixed.cellValueFactory = features => 
  ReadOnlyBooleanWrapper(features.value.fixed)

你应该使用

errorFixed.cellValueFactory = features => 
  ObjectProperty[Boolean](features.value.fixed)

ReadOnlyObjectWrapper[Boolean]

长答案的简短版本:在使用原始 Java 类型(如 boolean 或 int)时,Scala 和 Java 之间存在某些“摩擦”。这种不便体现在 ScalaFX 的属性绑定(bind)中。并非一切都以直观的方式继承。在这种情况下

ReadOnlyBooleanWrapper 

的子类
ObservableValue[scala.Boolean, java.lang.Boolean]

scala.Boolean 不是 java.lang.Boolean 的子类,在 ScalaFX 中这会导致复杂化。有趣的是,转换 .asInstanceOf[ObservableValue[scala.Boolean, scala.Boolean]] 有效,尽管类型参数在编译时不匹配。

感谢您提供完整的代码示例(要点),这确实有助于澄清问题。

关于scala - 奇怪的类型不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21671799/

相关文章:

java - 在WebView中显示不带 ".txt"扩展名的文本文件

java - JavaFX 2D 游戏中的对象动画

scala - SBT 从子项目运行 Main 方法

java - Scala.Byte vs java.lang.Byte - 推荐使用哪个?

Scala future 结合

java - 更新扩展 Task 的类中的文本

java - Scala/Java 中的 HTTP URL 地址编码

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

java - 使 ScalaFx 在 JDK 8 和 11 上都能工作