嗯,似乎不是。以下代码:
Error:(55, 13) inferred type arguments [Int] do not conform to method inBounds's
type parameter bounds [T <: Ordered[T]]
在编译时给我一个错误:
Int
但...... Ordered
必须以某种方式“import
”。我是否因某些隐含而错过了一些{{1}}?
答案 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]
,因此这就是Ordering
和Ordered
的原因。
答案 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
然后不再弃用。