在下面的方法中,我希望将函数的类型设置为强制要求from
和to
是相同类型的LexicalDate。即,它们必须都是Day
或者都必须是Hour
。
目前,from
和to
可以作为不同类型的LexicalDate传递。
是否可以在编译级别强制from
和to
始终是相同类型的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中的广义类型约束(无博士学位)