斯卡拉; (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 收到 MouseEvent
s :
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.and
java.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 柯里化函数的语法
我是一个玩scala-swing的scala新手。并希望在 scala.swing.event.MousEvent
上翻译给定的 scala.swing.Point
:
我想将鼠标事件发送给负责处理形状选择的 class。但是因为一个形状有一个相对于他的容器的位置(sheet)但是 MouseEvent.point 是相对于 window 我应该 translate/relativize之前。
所以,我有一个 Selection
class 收到 MouseEvent
s :
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.and
java.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 柯里化函数的语法