2

我在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]

ConvertableCelltrait 中,我的意图是说委托值(来自SFXDelegatetrait)必须是 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]

我理解错了吗?CheckBoxListCellconverterProperty方法。我们不能使用类型和存在类型作为适合我们委托类的模型吗?

4

1 回答 1

1

问题在于您对converterProperty. 您将其定义为无参数方法,而 scala 将其视为具有空参数列表的方法。这样做可以使其正确编译:

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

虽然 scala 将无参数方法和具有空参数列表的方法视为基本相同的东西(参见 scala 规范 @ 5.1.4),但它们仍然是不同的实体。并且在与 java 代码(没有无参数方法的概念)进行交互时,空值方法被视为具有空参数列表的方法,而不是无参数方法,因此结构类型不匹配。

于 2012-09-10T15:04:47.867 回答