据我所知,有两种方法可以添加类型约束。
trait Dummy
第一种方式
def doStuff[T <: Dummy](x: T) = x
第二种方式
def doStuff[T](x: T)(implicit x: T <:< Dummy) = x
两者都取得了相同的结果。
我只是想知道我应该直接使用上限或下限的场景,或者我应该使用implicit来在类型上附加约束。
答案 0 :(得分:5)
一个必须在每次调用调用时创建一个隐式对象,另一个只是在传递给函数的对象上放置一个类型约束。一般来说,我更倾向于声明[T <: Dummy]
而不是隐含的声明。
当你想要创建一个可以做某些事情的类型但只有当它满足某个约束时才使用隐式。因此,您在List[A]
声明中看到以下内容:
def sum(implicit ev: Numeric[A]) = ...
这是一种很好的说法,“你可以在类中放置任何类型的'A',但如果你想使用'sum',它必须符合......”以下面的类定义为例:
class Foo[T](value: T){
def doubleString = value.toString() + value.toString()
def specialSauce(implicit ev: T <:< Dummy): Dummy = ...
}
这允许我选择创建某种类型的Foo[Int]
并且它会起作用但不允许我调用该类的specialSauce
方法,除非T
是直接后代Dummy
。