2014-02-10 103 views
1

我有一個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]ReadOnlyBooleanWrapperaccording to the documentation的超類型。

如果我自己使用.asInstanceOf[ObservableValue[Boolean, Boolean]]來施放它,它似乎可以工作。這裏發生了什麼?

Gist with stripped down project to reproduce

+0

嘗試使用'(x:ObservableValue [Boolean,Boolean])'而不是'x.asInstanceOf [ObservableValue [Boolean,Boolean]]'。如果它工作,那麼它看起來像編譯器中的錯誤。 – senia

+0

@senia給我完全一樣的錯誤 – mgttlinger

+0

你試過'sbt乾淨'嗎? ObservableValue [Boolean,Boolean]中的'Boolean'是否有'java.lang.Boolean'?爲了以防萬一,我還會嘗試'((((x:BooleanProperty):Property [Boolean,Boolean]):ReadOnlyProperty [Boolean,Boolean]):ObservableValue [Boolean,Boolean])。 – senia

回答

1

簡短的回答是:不是

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

你應該使用

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

ReadOnlyObjectWrapper[Boolean]

長答案的簡短版本:在使用原始Java類型(如布爾型或int型)時,Scala和Java之間存在某些「摩擦」。這種不便顯示在ScalaFX中的屬性綁定中。並非所有東西都以直觀的方式繼承。在這種情況下

ReadOnlyBooleanWrapper 

ObservableValue[scala.Boolean, java.lang.Boolean] 

scala.Boolean一個子類不是java.lang.Boolean在內部,在ScalaFX這導致併發症的一個子類。有趣的是,鑄造.asInstanceOf[ObservableValue[scala.Boolean, scala.Boolean]]的作品,儘管類型參數在編譯時不匹配。

感謝您提出一個完整的代碼示例(要點),這真的有助於澄清問題。