比较Scala中泛型函数中泛型类型的值

比较Scala中泛型函数中泛型类型的值,scala,generics,Scala,Generics,以下函数 def compare[T] (o1:T, o2:T):Boolean = { o1 > o2 } 不会编译,因为value>不是类型参数T的成员 将参数定义为AnyVal类型也不起作用,编译器会给出类似的错误 但是,只能使用类型为String和Long的值调用该函数,这两种类型都支持 编写这样一个函数的建议解决方案是什么 谢谢如果您想使用操作符,您可以使用查看绑定和有序[T] def compare[T <% Ordered[T]] (o1:T, o2:T):Bo

以下函数

def compare[T] (o1:T, o2:T):Boolean = {
   o1 > o2
}
不会编译,因为
value>不是类型参数T的成员

将参数定义为
AnyVal
类型也不起作用,编译器会给出类似的错误

但是,只能使用类型为
String
Long
的值调用该函数,这两种类型都支持

编写这样一个函数的建议解决方案是什么


谢谢

如果您想使用
操作符,您可以使用查看绑定
有序[T]

def compare[T <% Ordered[T]] (o1:T, o2:T):Boolean = {
  o1 > o2
}
def比较[T o2
}
scala文档中有一些很好的例子

或者,您可以使用隐式参数执行此操作,因为现在不推荐使用视图边界:

def  compare[T](o1: T, o2: T)(implicit ev: T => Ordered[T]): Boolean = {
  o1 < o2
}
def compare[T](o1:T,o2:T)(隐式ev:T=>Ordered[T]):布尔={
o1
您可以像这样使用
排序
类型类:

def compare[T](o1: T, o2: T)(implicit ord: Ordering[T]) = ord.gt(o1, o2)

如果要避免显式提及隐式参数,同时也要避免使用现在已弃用的视图边界,可以通过定义类型别名,使用如下上下文边界:

type OrderedView[T] = T => Ordered[T]

def compare[T: OrderedView](o1: T, o2: T) = {
  o1 > o2
}

不幸的是,这种模式似乎没有很好的文档记录——我在尝试实现“丰富我的库”时发现了它模式而不使用上下文边界。

不推荐使用视图边界,您不应该使用它们,但可以使用上下文边界。这将为您提供对排序实例的隐式访问,您可以使用比较方法:

def compare[T: Ordering] (o1:T, o2:T):Boolean = {
  val ord = implicitly[Ordering[T]] 
  ord.compare(o1, o2) > 0
}
现在,如果必须大量直接使用运算符执行此操作,当然会更好。直接排序提供了一种隐式转换,您可以在本地导入:

def compare[T: Ordering] (o1:T, o2:T):Boolean = {
  val ord = implicitly[Ordering[T]] 
  import ord.mkOrderingOps
  o1 > o2
}