2011-06-10 219 views
2

我写这个方法斯卡拉 - 仿制药+隐式转换

def compare[U, T <: Comparable[U]](a: T, b: U) = a.compareTo(b) 

它与字符串和整数,但不能使用INT或RichInt。 那么为什么不是一个Int自动转换为Integer?

回答

4

使用简单的上下文绑定将需要编译器应用隐式转换之前转换后的值传递给方法。我相信你要的是这个,而是:

def compare[U, T <% Comparable[U]](a: T, b: U) = a.compareTo(b) 

这里,隐式包装“A”会发生的方法的实现里面,所以你应该能够得到你想要的东西。但是,我并不完全清楚你的用途是什么,但你应该尝试包括什么不起作用的例子,以便我们能够确定何时我们试着回答!

+2

这绝对是正确的使用模式。如果可以,我建议使用Scala的Ordered而不是Comparable。有序是Comparable的一个子特性,因此它们是兼容的。我确实想知道这种性能影响。对于每一个整数比较,我们知道有一个函数调用(可能是一个Integer的框),这对于重排比较操作来说不是很好。 – 2011-06-10 16:25:05

+0

谢谢。所以<:和<%之间的唯一区别是如何处理隐式转换? – SpiderPig 2011-06-10 16:36:21

+1

<:只是一个绑定类型,而<%是一个视图绑定。看到这个问题的全部细节:http://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala – mpilquist 2011-06-10 16:55:48