使用像这样的通用定义
case class Event(a : Int)
trait EventHelper[B <: Event] {
def getEvent : B
}
def genericFunction[T <: EventHelper[_]](x : T) = {
x.getEvent.a
}
为什么将genericFunction中的B视为Any?不应该被视为事件?
我的工作是
def genericFunction[T <: EventHelper[B], B <: Event ](x : T) = {
x.getEvent.a
}
但它看起来多余,不是吗?
答案 0 :(得分:2)
当您说T <: EventHelper[_]
时,您使用的是存在类型,需要特别注意定义上限和下限:
def genericFunction[T <: EventHelper[_ <: Event]](x : T) = x.getEvent.a
来自SLS:
Scala支持存在类型的占位符语法。通配符类型的格式为
_ >: L <: U
。两个绑定条款都可以省略。如果缺少下限项>: L
,则假定为>: scala.Nothing
。 如果缺少上限条款<: U
,则假定<: scala.Any
。通配符类型是存在量化类型变量的简写,其中存在量化是隐含的。
这意味着即使EventHelper
的类型参数的上限为Event
,如果没有上限,编译器仍会将_
推断为Any
为它提供了绑定。