Scala:类型参数不符合类类型参数边界

时间:2016-01-28 20:53:59

标签: scala

我的代码

object TestApp extends App {   
  class A[T <: Ordered[T]] {
    def check(f: T, s: T) = f > s
  }    
  object A {
    def apply[T] = new A[T]
  }   
  A[String].check("ab", "aa")    
}

抛出异常:

Error:(13, 9) type arguments [T] do not conform to class A's type parameter bounds [T <: Ordered[T]]
    def apply[T] = new A[T]
        ^

但我不明白为什么。对我来说,似乎没问题。我有一个带有Ordered的类型变量的类。在配套对象中,我尝试创建A的实例。但是我不确定我的伴随对象是否可以访问A类的类型变量。

我该如何解决?

1 个答案:

答案 0 :(得分:7)

String不会在scala中扩展Ordered,它只是java.lang.String的别名,而且您的apply不符合A中的上下文绑定{1}}(您接受任何T),您可以解决此类型需要隐式Ordering的问题:

scala> :pa
// Entering paste mode (ctrl-D to finish)

class A[T](implicit ord: Ordering[T]) {
  def check(f: T, s: T) = ord.gt(f, s)
}

object A {
  def apply[T](implicit ord: Ordering[T]) = new A[T]
}

A[String].check("ab", "aa")

// Exiting paste mode, now interpreting.

defined class A
defined object A
res0: Boolean = true

为了向您展示隐式转换不适用于上下文边界,我做了一个小例子:

scala> :pa
// Entering paste mode (ctrl-D to finish)

trait A
case class AA() extends A
case class CC()
implicit def conv(a: CC): A = AA() 

def f[T <: A](x: T): T = x
f(CC())

// Exiting paste mode, now interpreting.

<console>:23: error: inferred type arguments [CC] do not conform to method f's type parameter bounds [T <: A]
     f(CC())

正如您所看到的,我定义的隐式未应用于CC以匹配上下文绑定。