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.Cellof 型を返すTメソッドが呼び出されるof 型です。converterPropertyjavafx.beans.property.ObjectPropertyjavafx.util.StringConverter[T]

トレイトにいる間ConvertableCell、私の意図は、(トレイトからの) デリゲート値SFXDelegateは 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] は、特性 ConvertableCell の型パラメーターの境界に準拠していません [C <: scalafx.scene.control.cell.package.JfxConvertableCell[T],T]

私は何か間違ったことを理解しましたか?CheckBoxListCell方法がありconverterPropertyます。委任されたクラスに適合する型として、型と存在型を使用できないでしょうか?

4

1 に答える 1

1

問題は の定義にありconverterPropertyます。これをパラメーターなしのメソッドとして定義しますが、scala からは空のパラメーター リストを持つメソッドとして認識されます。これを行うだけで、適切にコンパイルされます。

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

scala は、パラメーターのないメソッドと空のパラメーター リストを持つメソッドをオーバーライドに関する限り本質的に同じものとして扱いますが (scala spec @ 5.1.4 を参照)、それらは依然として異なるエンティティです。また、Java コード (パラメーターなしのメソッドの概念がない) と相互運用する場合、nullary メソッドは、パラメーターなしのメソッドとしてではなく、空のパラメーター リストを持つメソッドと見なされるため、構造型が一致しません。

于 2012-09-10T15:04:47.867 に答える