【问题标题】:Scala; Expression of type (X)=>X doesn't conform to type SupX斯卡拉; (X)=>X 类型的表达式不符合 SupX 类型
【发布时间】:2015-07-20 07:26:07
【问题描述】:

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

我想将鼠标事件发送到负责处理形状选择的类。但是因为一个形状有一个相对于他的容器的位置(sheet)但是 MouseEvent.point 是相对于窗口的,我应该在之前翻译/相对化它。

所以,我有一个Selection 类接收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
  }  
}

我可以用丑陋的演员绕过这个问题:

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

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

错误:(32, 21) 类 MousePressed 中的方法复制缺少参数; 如果您想将其视为部分应用的函数,请在此方法后面加上 `_'

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

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

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

非常感谢

【问题讨论】:

    标签: scala scala-swing


    【解决方案1】:

    关于编译器问题,您可以通过查看 MouseEvent(特别是 MousePressed)文档来了解抱怨的原因。

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

    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

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

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

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

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

    partially applying 柯里化函数的语法

    【讨论】:

    • 非常感谢。它消除了强制转换的需要(我的 Ide 需要谁来解析这个错误的表达式)
    猜你喜欢
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多