斯卡拉; (X)=>X 类型的表达式不符合 SupX 类型

Scala; Expression of type (X)=>X doesn't conform to type SupX

我是一个玩scala-swing的scala新手。并希望在 scala.swing.event.MousEvent 上翻译给定的 scala.swing.Point :

我想将鼠标事件发送给负责处理形状选择的 class。但是因为一个形状有一个相对于他的容器的位置(sheet)但是 MouseEvent.point 是相对于 window 我应该 translate/relativize之前。

所以,我有一个 Selection class 收到 MouseEvents :

case class Selection(sheet:Sheet) {

  def on(event:Event) = event match {
    case clicked:MouseClicked => {
      clicked.modifiers match {
        case scala.swing.event.Key.Modifier.Control => 
          sheet.getItemAt(clicked.point).map(addToSelection)
        case _ => 
          sheet.getItemAt(clicked.point).map(setSelection)
      }
    }
  }
}

还有一个 Sheet 他的形状容器(并且知道如何转换点)。

class Sheet extends Component {
  private val selection = Selection(this)

  listenTo(mouse.clicks, mouse.moves)
  reactions += {
    case e:MousePressed => selection.on(translate(e))
    case e:MouseClicked => selection.on(translate(e))
  }

  /** Here is my problem :
   * > Expression of type (MouseEvent) => MousePressed doesn't conform to expected type Event
   */
  def translate(original: MouseEvent): Event = original match {
    case pressed:MousePressed =>
      pressed.copy(point=relativize(pressed.point))
    case clicked:MouseClicked =>
      clicked.copy(point=relativize(pressed.point))
    case other:MouseEvent=>
      other
  }  
}

我可以用一个丑陋的 cast 绕过这个问题:

case pressed:MousePressed =>
      pressed.copy(point=relativize(pressed.point)).asInstanceOf[MousePressed]

但是我遇到了另一个更奇怪的编译器问题:

Error:(32, 21) missing arguments for method copy in class MousePressed; follow this method with `_' if you want to treat it as a partially applied function

pressed.copy(point = relativize(pressed.point)).asInstanceOf[MousePressed]

在这里,我迷路了,需要你的帮助来完成这个简单的转换。

当然,所有方法都使用 scala.swing._ 类型(绝不会在 scala.swing.andjava.awt.` 之间混合使用)

非常感谢

关于编译器问题,您可以通过查看 MouseEvent (and specifically MousePressed) 文档了解抱怨的内容。

案例class定义了两个参数列表,具有以下简化签名

MousePressed(source: Component, point: java.awt.Point, modifiers: Modifiers, clicks: Int, triggersPopup: Boolean)(peer: java.awt.event.MouseEvent) extends MouseButtonEvent 

如您所见,还有第二个参数列表需要 peer 对象,它是基础 java swing 对象。您可以使用同名属性访问 peer 实例(例如 pressed.peer

由案例class定义生成的copy方法,可能需要第二个参数,像这样

pressed.copy(point = relativize(pressed.point))(pressed.peer)

由于缺少第二个参数列表,编译器推断您想要部分应用 copy 方法,因此它建议您使用

pressed.copy(point = relativize(pressed.point) _

partially applying 柯里化函数的语法