Scala 中的类型 - 下界

Max*_*Max 3 generics scala type-bounds

在下面的代码上。

我的期望是它T必须是 a 类型Bor A,因此调用lowerBound(new D)可能不应该编译(?)。类似的上限实验给了我预期的类型检查错误。

谢谢你的提示。

object varianceCheck {
  class A {
    override def toString = this.getClass.getCanonicalName
  }

  class B extends A
  class C extends B
  class D extends C

  def lowerBound[T >: B](param: T) = { param }

  println(lowerBound(new D))                      //> varianceCheck.D
}
Run Code Online (Sandbox Code Playgroud)

4le*_*x1v 5

通过您的实现,您可以编写:

scala>   def lowerBound[T >: B](param: T) = { param }
lowerBound: [T >: B](param: T)T

scala> lowerBound(new AnyRef {})
res0: AnyRef = $anon$1@2eef224
Run Code Online (Sandbox Code Playgroud)

whereAnyRef是所有对象/引用类型的超类型(实际上它是 JavaObject类的别名)。这是正确的, T >: B表示类型参数T或抽象类型T引用type的超类型B

你只是有一个不好的例子toString,因为这个方法有所有的对象类型,但是如果你把它改成 on someMethod,你lowerBound就不会编译:

<console>:18: error: value someMethod is not a member of type parameter T
       def lowerBound[T >: B](param: T) = { param.someMethod }
Run Code Online (Sandbox Code Playgroud)

如果将其更改为T <: B,这意味着类型的参数T是 的子类B,那么一切都很好,因为它param具有someMethod方法:

def lowerBound[T <: B](param: T) = { param.someMethod }
Run Code Online (Sandbox Code Playgroud)