3

以下代码编译成功,但第二个无法编译。据我了解,这两个符号都意味着类型约束。

class Hello[T <: String](t:T)

class Hello[T <:< String](t:T)
4

1 回答 1

6

他们有点不同。<: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)
                 ^
于 2012-12-24T08:55:27.343 回答