奇怪的类型不匹配错误

时间:2014-02-10 08:01:46

标签: scala javafx scalafx

我在errorFixed内有TableColumn[Error, Boolean]类型的表格列TableView[Error]。我的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 according to the documentation的超类型。

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

Gist with stripped down project to reproduce

1 个答案:

答案 0 :(得分:3)

简短回答是:而不是

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

你应该使用

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

ReadOnlyObjectWrapper[Boolean]

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

ReadOnlyBooleanWrapper 

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

但是scala.Boolean不是java.lang.Boolean的子类,在内部,ScalaFX会导致并发症。有趣的是,转换.asInstanceOf[ObservableValue[scala.Boolean, scala.Boolean]]有效,但类型参数在编译时不匹配。

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