当未显式指定类型参数时,Scala 下限类型参数不起作用

Sur*_*rat 2 scala covariance type-parameter type-bounds

我有一个下面的类,它使用协方差注释和另一个类型参数作为其方法,该类类型参数是下界

class MyQueue[+T]{
  def add[U >: T](arg:U):Unit= {
    println("Arg value :"+ arg)
  }
}
Run Code Online (Sandbox Code Playgroud)

鉴于上面的代码,我不明白为什么下面的行执行成功。根据我对下限的理解,方法“add”应该只接受 Int 类型或其超类型的值。

val q1:MyQueue[Int] = new MyQueue[Int]
q1.add("string")
Run Code Online (Sandbox Code Playgroud)

但是,如果我们如下显式指定类型参数,它会给出预期的编译错误(String 不符合方法 add 的类型参数界限)

q1.add[String]("string")
Run Code Online (Sandbox Code Playgroud)

Mik*_*nte 5

String不是 的超类型,但和Int之间共享一个公共超类型,即IntStringAny

val q1:MyQueue[Int] = new MyQueue[Int]
q1.add("string")
Run Code Online (Sandbox Code Playgroud)

相当于

val q1:MyQueue[Int] = new MyQueue[Int]
q1.add[Any]("string")
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您显式传递String作为类型参数,则会发生编译错误,因为String不是 的超类型Int