Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我会得到;找不到参数ord的隐式值:scala.math.Ordering[T]“0”;_Scala - Fatal编程技术网

为什么我会得到;找不到参数ord的隐式值:scala.math.Ordering[T]“0”;

为什么我会得到;找不到参数ord的隐式值:scala.math.Ordering[T]“0”;,scala,Scala,我有一个简单的示例trait,它有一个从Ordered派生的泛型类型的值。我找不到任何实际使用该值的方法,尽管我得到“找不到参数order:scala.math.Ordering[t]的隐式值”。代码如下: trait Example[T <: Ordered[_]] { val key: T def before(that: Example[T]): Boolean = (key < that.key) } trait-Example[T在我看来应该是这样的 t

我有一个简单的示例trait,它有一个从Ordered派生的泛型类型的值。我找不到任何实际使用该值的方法,尽管我得到“找不到参数order:scala.math.Ordering[t]的隐式值”。代码如下:

trait Example[T <: Ordered[_]] {
  val key: T

  def before(that: Example[T]): Boolean = (key < that.key)    
}

trait-Example[T在我看来应该是这样的

trait Example[T <: Ordered[T]] {

trait-Example[T我相信,我没有编译,因为你说
T
应该在任何类型上排序。我们可以这样编写一个等价的trait(如果我错了,请纠正我,我不确定它是否可以被视为等价的,但至少你会从编译器那里收到相同的错误):

当我们考虑这个定义时-如果
key
Ordered[A]
而不是
,那么.key
应该是
A
类型(根据

trait Example1[A, T <: Ordered[A]] {
    val key: T

    def before(that: Example1[A, T]): Boolean = (key < that.key)
}
trait Ordered[A] extends java.lang.Comparable[A] {
  ...

  def <  (that: A): Boolean = (this compare that) <  0
  ...
}

object Ordered {  
  /** Lens from Ordering[T] to Ordered[T] */
  implicit def orderingToOrdered[T](x: T)(implicit ord: Ordering[T]): Ordered[T] = 
    new Ordered[T] { def compare(that: T): Int = ord.compare(x, that) }
}
abstract class Example[T: Ordering] {
  val key: T
  val ord = implicitly[Ordering[T]]
  import Ordered._

  def before(that: Example[T]): Boolean = key < that.key
}

var one = new Example[Int] {val key = 1}
var two = new Example[Int] {val key = 2}

println(one.before(two)) // prints: true
println(two.before(one)) // prints: false