Scala泛型类型" transmition"

时间:2015-02-18 13:50:05

标签: scala generics

使用像这样的通用定义

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
}

但它看起来多余,不是吗?

1 个答案:

答案 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为它提供了绑定。