次のコードは正常にコンパイルされますが、2 番目のコードはコンパイルできませんでした。私の理解では、これら2つの記号はどちらも型制約を意味します。
class Hello[T <: String](t:T)
class Hello[T <:< String](t:T)
次のコードは正常にコンパイルされますが、2 番目のコードはコンパイルできませんでした。私の理解では、これら2つの記号はどちらも型制約を意味します。
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])
編集:
1 つの使用例は、1 つの型 param が他の型のサブタイプであることを証明することです。
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)
^