我在ScalaFX项目中工作。在这一刻,我正在改编课程javafx.scene.control.cell
。在这个包中,具有相同签名的方法在许多类中重复。例如StringConverter<T> converter()
。为了避免不必要的代码重复(并了解如何使用存在类型),我创建了以下代码:
// 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
想说的类型
我的类型是一个
javafx.scene.control.Cell
类型T
,它有一个调用的方法converterProperty
返回一个javafx.beans.property.ObjectProperty
类型javafx.util.StringConverter[T]
。
在ConvertableCell
trait 中,我的意图是说委托值(来自SFXDelegate
trait)必须是 type 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] 不符合 trait ConvertableCell 的类型参数边界 [C <: scalafx.scene.control.cell.package.JfxConvertableCell[T],T]
我理解错了吗?CheckBoxListCell
有converterProperty
方法。我们不能使用类型和存在类型作为适合我们委托类的模型吗?