【问题标题】:Scala: type arguments do not conform to class type parameter boundsScala:类型参数不符合类类型参数范围
【发布时间】:2016-01-29 05:43:34
【问题描述】:

我的代码

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 的类型变量。

我该如何解决?

【问题讨论】:

    标签: scala


    【解决方案1】:

    String 不会在 scala 中扩展 Ordered,它只是 java.lang.String 的别名,而且您的 apply 不符合您在 A 中的上下文绑定(您接受任何 @987654326 @ 那里),您可以解决该类型要求隐式 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 以匹配上下文绑定。

    【讨论】:

    • 但是String 有隐式转换器到StringOps,它确实扩展了Ordered 特征。
    • implicit def augmentString(x: String): StringOps = new StringOps(x) in Predef
    • 我可以写 class B { def check(f: String, s: String) = f &gt; s } 并且它有效。
    • @Finkelson 同意,事实上,如果您执行 val p: StringOps = "123" 之类的操作,从 StringStringOps 的隐式转换就会启动,但它不会满足上下文绑定。跨度>
    • @Finkelson 我添加了一个小例子,表明隐式不能满足上下文边界。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 2021-07-25
    相关资源
    最近更新 更多