未明确指定类型参数时,Scala 下限类型参数不起作用
Scala lower bound type parameter does not work when type argument is not specified explicitly
我有一个下面的class,它使用协方差注释和另一个类型参数作为其方法的class类型参数的下限
class MyQueue[+T]{
def add[U >: T](arg:U):Unit= {
println("Arg value :"+ arg)
}
}
鉴于上面的代码,我不明白为什么下面的行可以成功执行。根据我对下限的理解,方法 "add" 应该只接受 Int 类型或其超类型的值。
val q1:MyQueue[Int] = new MyQueue[Int]
q1.add("string")
但是,如果我们如下显式指定类型参数,它会给出预期的编译错误(字符串不符合方法 add 的类型参数边界)
q1.add[String]("string")
String
不是 Int
的超类型,但 Int
和 String
之间有一个共同的超类型,即 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
的超类型
我将添加到 @MikelSanVicente 的回答中,如果你不想 q1.add("string")
编译你应该用隐式类型约束替换类型绑定
class MyQueue[+T]{
def add[U](arg: U)(implicit ev: T <:< U): Unit= {
println("Arg value :"+ arg)
}
}
val q1: MyQueue[Int] = new MyQueue[Int]
q1.add("string") // doesn't compile
q1.add[String]("string") // doesn't compile
q1.add[Any]("string") // compiles
https://blog.bruchez.name/2015/11/generalized-type-constraints-in-scala.html
我有一个下面的class,它使用协方差注释和另一个类型参数作为其方法的class类型参数的下限
class MyQueue[+T]{
def add[U >: T](arg:U):Unit= {
println("Arg value :"+ arg)
}
}
鉴于上面的代码,我不明白为什么下面的行可以成功执行。根据我对下限的理解,方法 "add" 应该只接受 Int 类型或其超类型的值。
val q1:MyQueue[Int] = new MyQueue[Int]
q1.add("string")
但是,如果我们如下显式指定类型参数,它会给出预期的编译错误(字符串不符合方法 add 的类型参数边界)
q1.add[String]("string")
String
不是 Int
的超类型,但 Int
和 String
之间有一个共同的超类型,即 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
我将添加到 @MikelSanVicente 的回答中,如果你不想 q1.add("string")
编译你应该用隐式类型约束替换类型绑定
class MyQueue[+T]{
def add[U](arg: U)(implicit ev: T <:< U): Unit= {
println("Arg value :"+ arg)
}
}
val q1: MyQueue[Int] = new MyQueue[Int]
q1.add("string") // doesn't compile
q1.add[String]("string") // doesn't compile
q1.add[Any]("string") // compiles
https://blog.bruchez.name/2015/11/generalized-type-constraints-in-scala.html