我在Scala中有两个案例类,如下所示:
case class User(name:String, countA:Int, countB:Int)
case class Store(l: User, a: Iterable[User], b: Iterable[User]) {
def longFoldLeft(s: Long)(f: (Long, User) => Long): Long = {
val foldLeftB = b.foldLeft(s)(f)
val foldLeftA = a.foldLeft(foldLeftB)(f)
val result = f(foldLeftA, l)
result
}
}
如您所见,我想在 Store 类中创建一个函数,该函数在a和b上执行foldLeft,最后将结果附加在 l 上。
现在,我要确保结果类型支持 + 方法。在scala中有可能吗?如果是,那怎么办?
答案 0 :(得分:3)
您可以使用结构性键入:
def longFoldLeft[T <: { def +(v: T): T}](s: T)(f: (T, User) => T): T = {
f(lead) + typeA.foldLeft(typeB.foldLeft(s)(f))(f)
}
另请参阅:https://alvinalexander.com/scala/how-to-use-duck-typing-in-scala-structural-types
答案 1 :(得分:1)
我建议将Long
替换为不受约束的类型参数T
:
def foldLeft[T](s: T)(f: (T, User) => T): T = {
val foldLeftB = b.foldLeft(s)(f)
val foldLeftA = a.foldLeft(foldLeftB)(f)
f(foldLeftA, l)
}
如果此API的用户后来想将其与Long
,Int
,Numeric
的任何子类型或存在{{3}的实例的类型},那么仍然有可能。没有理由对T
施加不必要的约束。