我的代码
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类的类型变量。
我该如何解决?
答案 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
以匹配上下文绑定。