当类型参数存在类型边界时,Scala如何确定要推断的类型?例如:
def onMouseClicked_=[T >: MouseEvent](lambda: T => Unit) =
setOnMouseClicked(new EventHandler[T] {
override def handle(event: T): Unit = lambda(event)
})
尝试使用此功能时,例如:
onMouseClicked = { me => doSomething() }
me
的推断类型为MouseEvent
。 T
的类型范围是较低的类型范围,因此T
必须是MouseEvent
类型或MouseEvent
的超类型,那么为什么me
具有MouseEvent
推断的Event
类型?它不应该推断出最普遍的类型吗?
对于Scala的类型推断是如何工作的,我是不是得到了什么?或者我对类型界限的理解是完全错误的?
编辑:
假设我们进一步将T的类型限制为Event
的子类型,其中MouseEvent
是def onMouseClicked_=[T >: MouseEvent <: Event](lambda: T => Unit) =
setOnMouseClicked(new EventHandler[T] {
override def handle(event: T): Unit = lambda(event)
})
的超类型。所以我们得到:
onMouseClicked = { me: MouseDragEvent => doSomething() }
所以如果我们这样做
MouseDragEvent
其中MouseEvent
是me
的子类型,编译因类型错误而失败,正如预期的那样,因为绑定确保MouseEvent
必须是onMouseClicked = { me: Any => doSomething() }
的超类型
然而,如果我们这样做
Any
编译成功。很明显Event
不是T
的子类型,为什么编译成功呢?什么是{{1}}的推断类型?
答案 0 :(得分:1)
我对这个答案的准确性并不完全有信心,但这里有......
lamba
的类型为T => Unit
,是Function1[T, Unit]
的糖,定义为:
trait Function1[-T1, +R]
T
用于第一个参数T1
,它是逆变的,由-
中的-T1
表示。对于逆变参数,层次结构中的最低类型是最常用的。