强制多态参数为相同类型



在下面的方法中,我希望将函数的类型设置为强制要求fromto是相同类型的LexicalDate。即,它们必须都是Day或者都必须是Hour

目前,fromto可以作为不同类型的LexicalDate传递。

是否可以在编译级别强制fromto始终是相同类型的LexicalDate

sealed trait LexicalDate 
case object Day extends LexicalDate
case object Hour extends LexicalDate
def queryDate[Date <: LexicalDate](
id: Long,
from: Date,
to: Date
)

您正在寻找的是广义类型约束=:=,它要求编译器能够证明两个类型是相等的。对于您的情况,=:=可以如下使用(特别是注意queryDate方法的隐式参数列表):

scala> def queryDate[A <: LexicalDate, B <: LexicalDate](id: Long, from: A, to: B)(implicit ev: A =:= B) { }
queryDate: [A <: LexicalDate, B <: LexicalDate](id: Long, from: A, to: B)(implicit ev: A =:= B)Unit
scala> queryDate(10, Day, Day)
scala> queryDate(10, Hour, Hour)
scala> queryDate(10, Day, Hour)
<console>:15: error: Cannot prove that Day.type =:= Hour.type.
queryDate(10, Day, Hour)
^
scala> queryDate(10, Hour, Day)
<console>:15: error: Cannot prove that Hour.type =:= Day.type.
queryDate(10, Hour, Day)
^

有关广义类型约束的一般描述,请参阅以下链接:

  • 做什么<:<lt;%<,和=:=Scala 2.8中的平均值,它们记录在哪里
  • Scala中的广义类型约束(无博士学位)

最新更新