2012-09-10 12 views
2

我在ScalaFX項目中工作。在這一刻,我正在適應javafx.scene.control.cell的課程。在這個包中,具有相同簽名的方法被複制到許多類中。例如StringConverter<T> converter()。爲了避免不必要的重複代碼(並知道如何使用存在的類型),我創建了下面的代碼:類型作爲Scala的授權類的模型

// Defined in scalafx.util package. All classes in scalafx use this trait 
package scalafx.util 

trait SFXDelegate[+D <: Object] extends AnyRef { 
    def delegate: D 

    override def toString = "[SFX]" + delegate.toString 

    override def equals(ref: Any): Boolean = { 
    ref match { 
     case sfxd: SFXDelegate[_] => delegate.equals(sfxd.delegate) 
     case _ => delegate.equals(ref) 
    } 
    } 

    override def hashCode = delegate.hashCode 
} 

// Package Object 
package scalafx.scene.control 

import javafx.{ util => jfxu } 
import javafx.beans.{ property => jfxbp } 
import javafx.scene.{ control => jfxsc } 
import scalafx.Includes._ 
import scalafx.beans.property.ObjectProperty 
import scalafx.util.SFXDelegate 
import scalafx.util.StringConverter 

package object cell { 

    type Convertable[T] = { 
    def converterProperty: jfxbp.ObjectProperty[jfxu.StringConverter[T]] 
    } 

    type JfxConvertableCell[T] = jfxsc.Cell[T] with Convertable[T] 

    trait ConvertableCell[C <: JfxConvertableCell[T], T] 
    extends SFXDelegate[C] { 
    def converter: ObjectProperty[StringConverter[T]] = ObjectProperty(delegate.converterProperty.getValue) 
    def converter_=(v: StringConverter[T]) { 
     converter() = v 
    } 
    } 

} 

JfxConvertableCell型我想說

我喜歡的類型是Tjavafx.scene.control.Cell它有一個名爲converterProperty的方法,返回javafx.beans.property.ObjectProperty類型javafx.util.StringConverter[T]

雖然ConvertableCell特質,我的意思是說,(從SFXDelegate性狀)該委託值必須爲JfxConvertableCell類型。我試圖創建第一類是的CheckBoxListCell反部分:

package scalafx.scene.control.cell 

import javafx.scene.control.{cell => jfxscc} 
import scalafx.scene.control.ListCell 
import scalafx.util.SFXDelegate 

class CheckBoxListCell[T](override val delegate: jfxscc.CheckBoxListCell[T] = new jfxscc.CheckBoxListCell[T]) 
    extends ListCell[T](delegate) 
    with ConvertableCell[jfxscc.CheckBoxListCell[T], T] 
    with SFXDelegate[jfxscc.CheckBoxListCell[T]] { 

} 

但是在這一刻,我從編譯器這樣的信息:

類型參數[javafx.scene.control.cell .CheckBoxListCell [T],T]不符合特質ConvertableCell的類型參數界限[C <:scalafx.scene.control.cell.package.JfxConvertableCell [T],T]

我才明白什麼了嗎? CheckBoxListCellconverterProperty方法。我們不能使用類型和存在類型作爲我們適合我們的委託類的模具嗎?

+0

我不舒服爲什麼它不起作用。 你可以使用一些隱式轉換來轉換爲你想要的類型嗎? https://gist.github.com/257758 – axaluss

+0

可能是關係CheckBoxListCell <:JfxConvertableCell不是真的,因爲編譯器不夠聰明,看不到這個。 – axaluss

回答

1

問題在於你的定義converterProperty。您將其定義爲無參數方法,而通過scala將其視爲具有空參數列表的方法。 只是在做這使得正確編譯:

type Convertable[T] = { 
    def converterProperty(): jfxbp.ObjectProperty[jfxu.StringConverter[T]] 
} 

雖然斯卡拉把一個參數的方法,並與空參數列表的方法本質上是儘可能壓倒一切的擔心同樣的事情(見階規格@ 5.1.4) ,他們仍然是不同的實體。 並且當與java代碼(沒有無參數方法的概念)進行互操作時,空方法被視爲具有空參數列表的方法,而不是無參數方法,因此結構類型不匹配。