以下代码编译成功,但第二个无法编译。据我了解,这两个符号都意味着类型约束。
class Hello[T <: String](t:T)
class Hello[T <:< String](t:T)
以下代码编译成功,但第二个无法编译。据我了解,这两个符号都意味着类型约束。
class Hello[T <: String](t:T)
class Hello[T <:< String](t:T)
他们有点不同。<:
is 是一个类型约束,意思A
是 的子类型B
,而<:<
is 是一个类型,意思是一样的。所以这会起作用:
class Hello[T <: String](t:T)
class Hello[T](t: T <:< String)
选择
class Hello[T](t: <:<[T, String])
编辑:
一个用例是证明一种类型参数是另一种类型的子类型:
def foo[A,B](a: A, b: B)(implicit ev: A <:< B) = "yay"
scala> foo(Nil, List(1,2,3))
res13: java.lang.String = yay
scala> foo(List(1,2,3), Nil)
<console>:9: error: Cannot prove that List[Int] <:< scala.collection.immutable.Nil.type.
foo(List(1,2,3), Nil)
^