2016-02-14 109 views
1

在通用功能的通用型的值进行比较下面的函数在斯卡拉

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

不会编译,因为value > is not a member of type parameter T

定义参数要AnyVal类型也不起作用,而编译器给出了类似的错误。

但是,该功能只能使用类型StringLong的值调用,它们支持>

写这样一个函数的recomended soultion是什么?

感谢

回答

2

如果你想使用>运营商可以使用绑定观点与Ordered[T]

def compare[T <% Ordered[T]] (o1:T, o2:T):Boolean = { 
    o1 > o2 
} 

有Scala的文档很好的例子。

http://docs.scala-lang.org/tutorials/FAQ/context-and-view-bounds.html

,或者你可以用隐含参数事业视图边界现在就这样做已被弃用:

def compare[T](o1: T, o2: T)(implicit ev: T => Ordered[T]): Boolean = { 
    o1 < o2 
} 
4

可以使用Ordering类型的类,像这样:

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

如果您希望避免明确提及隐式参数,但也要避免使用现在不推荐使用的视图边界,您可以使用像这样的上下文边界来实现通过定义一个类型别名:

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

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

这种模式似乎并不十分充分证明,遗憾的是 - 我发现它a post in the scala-internals mailing list试图找出如何实现“丰富我的图书馆”模式,而不时使用上下文边界。

0

视图边界已被弃用,您不应该使用它们,但可以使用上下文边界。这会给你一个排序实例的隐式访问,你可以用比较方法:如果你不得不这样做了很多直接使用运营商是好得多,当然

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 
}