【发布时间】:2017-06-20 20:22:54
【问题描述】:
当类型是泛型时,我无法为函数参数设置默认值。
我的函数签名如下:
def doStuff[ K, T ]( result: Future[ Seq[ T ] ] )
( transform: T => Option[ K ] ): Future[ Either[ String, Option[ K ] ] ] = {
}
而且我知道我给函数参数设置了一个默认值,例如:
def doStuff(a: Int)
(f: Int => Option[Int] = k => Option(k)): Future[ Either[ String, Option[ Int ] ] ] = {
}
但是我不能将这些泛型类型与默认函数值结合起来
def doStuff[ K, T ]( result: Future[ Seq[ T ] ] )
( transform: T => Option[ K ] = k => Option(k)): Future[ Either[ String, Option[ K ] ] ] = {
}
带有明显的错误信息:Option[T] 不符合预期的 Option[K]
我最后的办法是为 K 和 T 传递类标记并将默认参数从 k => Option(k) 更改为
def doStuff[ K: ClassTag, T ]( result: Future[ Seq[ T ] ] )
( transform: T => Option[ K ] = {
case m: K => Option( m )
case _ => None
} ): Future[ Either[ String, Option[ K ] ] ] = {
}
但这种方法将迫使我在函数调用时传入我的泛型参数。
谁能看到其他方法?
【问题讨论】:
-
T和K之间有关系吗? -
对于默认情况 K 是 Option[T] 但否则不,根本没有关系,它们可以并且将是完全不同的情况类
-
@kali 有必要让
doStuff有两个参数列表吗?可以和一个吗? -
如果你想不出一个合理的默认值,为什么要分配一个?
-
或者您的目标是在没有提供第二个参数时也让
K默认为T?
标签: scala generics default-value