未明确指定类型参数时,Scala 下限类型参数不起作用

标签 scala covariance type-parameter type-bounds

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

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

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

val q1:MyQueue[Int] = new MyQueue[Int]
q1.add("string")

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

q1.add[String]("string")

最佳答案

String 不是 Int 的父类(super class)型,但 IntString 之间共享一个公共(public)父类(super class)型,并且即 Any

val q1:MyQueue[Int] = new MyQueue[Int]
q1.add("string")

相当于

val q1:MyQueue[Int] = new MyQueue[Int]
q1.add[Any]("string")

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

关于未明确指定类型参数时,Scala 下限类型参数不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58892610/

相关文章:

java - 声明扩展 2 个不同接口(interface)的类型属性

c# - 在这个例子中可以消除类型参数的重复吗?

scala - org.joda.time.DateTimeFormat 线程安全吗?

scala - 使用 databricks-connect 连接到 python 中的 databricks 时出错

arrays - 是否可以在不使用“Array.map box”的情况下将“T []参数传递给需要obj []的函数?

c# - 为什么 ReadOnlyCollection 不允许协方差?

scala - 关于此 Scala 模式匹配中未经检查的类型参数的警告?

.net - ConcurrentQueue(Of T) 的元素无法加宽

java - 是否有一种类似 C 的迷你语法/语言可以同时翻译为 native C/C++ 和 Java?

scala - 在scala模式匹配中,可变模式可疑的阴影是什么?