3
以下代碼可以成功編譯,但第二種編譯方式無法編譯。正如我理解這兩個符號都意味着類型約束。爲什麼我可以在類型聲明上使用「<:」,但不能使用「<:<」
class Hello[T <: String](t:T)
class Hello[T <:< String](t:T)
以下代碼可以成功編譯,但第二種編譯方式無法編譯。正如我理解這兩個符號都意味着類型約束。爲什麼我可以在類型聲明上使用「<:」,但不能使用「<:<」
class Hello[T <: String](t:T)
class Hello[T <:< String](t:T)
他們有點不同。 <:
是一種類型約束,意思是A
是B
的子類型,而<:<
是一種意義相同的類型。因此,這會工作:
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)
^
您能否詳細說明一下?我明白<:,但我不明白你的意思是'同一件事'。何時使用<:<與<:<相反? –
已更新我的帖子 – drexin
也許將<:<[A,B]作爲一種類型會更加清楚,其值是證明A是B的子類型的證明。另請參見http://www.scala-lang.org /api/current/scala/Predef$$$less$colon$less.html這是scala中http://en.wikipedia.org/wiki/Curry%E2%80%93Howard_correspondence的小版本。 – aemxdp