在Scala中Int是一个有序类型吗?

时间:2018-02-05 19:14:45

标签: scala

嗯,似乎不是。以下代码:

Error:(55, 13) inferred type arguments [Int] do not conform to method inBounds's 
type parameter bounds [T <: Ordered[T]]

在编译时给我一个错误:

Int

但...... Ordered必须以某种方式“import”。我是否因某些隐含而错过了一些{{1}}?

2 个答案:

答案 0 :(得分:4)

Int是Numeric,其Ordering。与所有其他原始JVM类型一样,它不会扩展任何其他内容。这值得一读。

import scala.math.Ordering.Implicits._

def inBounds[T : Ordering](
  lowerBound: T,
  value: T,
  upperBound: T
): Boolean = {
    lowerBound <= value && value <= upperBound
}

值得注意的是,大多数时候你会处理Scala隐含的排序风格,而不是Ordered,它只是出于遗留原因才真正存在。(例如Java互操作)。

如果您深入了解源代码here,您会发现它实际上已延伸java.lang.Comparable[T],因此这就是OrderingOrdered的原因。

答案 1 :(得分:1)

是否可以使用&lt;%而不是&lt;:?

scala> def inBounds[T <% Ordered[T]](lowerBound: T, value: T, upperBound: T): Boolean =
     |     lowerBound <= value && value <= upperBound
inBounds: [T](lowerBound: T, value: T, upperBound: T)(implicit evidence$1: T => Ordered[T])Boolean

scala> inBounds (3, 4, 5)
res32: Boolean = true

REPL和Tzach Zohar指出:

def inBounds[T](lowerBound: T, 
  value: T, 
  upperBound: T)(implicit ev$1: T => Ordered[T]): Boolean =
    lowerBound <= value && value <= upperBound

然后不再弃用。