=:=

@implicitNotFound(msg = "Cannot prove that ${From} =:= ${To}.") sealed abstract
class =:=[From, To] extends From <:< To with Serializable

An instance of A =:= B witnesses that the types A and B are equal. It also acts as a A <:< B, but not a B <:< A (directly) due to restrictions on subclassing.

In case of any confusion over which method goes in what direction, all the "Co" methods (including apply) go from left to right in the type ("with" the type), and all the "Contra" methods go from right to left ("against" the type). E.g., apply turns a From into a To, and substituteContra replaces the Tos in a type with Froms.

Type Params
From

a type which is proved equal to To

To

a type which is proved equal to From

See also

&lt;:&lt; for expressing subtyping constraints

Example

An in-place variant of scala.collection.mutable.ArrayBuffer#transpose

implicit class BufOps[A](private val buf: ArrayBuffer[A]) extends AnyVal {
  def inPlaceTranspose[E]()(implicit ev: A =:= ArrayBuffer[E]) = ???
  // Because ArrayBuffer is invariant, we can't make do with just a A <:< ArrayBuffer[E]
  // Getting buffers *out* from buf would work, but adding them back *in* wouldn't.
}
Source
typeConstraints.scala
class From <:< To
trait From => To
class Object
trait Matchable
class Any

Value members

Abstract methods

override
def substituteBoth[F[_, _]](ftf: F[To, From]): F[From, To]
Definition Classes
Source
typeConstraints.scala

Concrete methods

def andThen[C](r: To =:= C): From =:= C

If From = To and To = C, then From = C (equality is transitive)

If From = To and To = C, then From = C (equality is transitive)

Source
typeConstraints.scala
override
def apply(f: From): To

Coerce a From into a To.

Coerce a From into a To. This is guaranteed to be the identity function.

This method is often called implicitly as an implicit A =:= B doubles as an implicit view A => B.

Definition Classes
Source
typeConstraints.scala
def compose[C](r: C =:= From): C =:= To

If From = To and C = From, then C = To (equality is transitive)

If From = To and C = From, then C = To (equality is transitive)

Source
typeConstraints.scala

If From = To then To = From (equality is symmetric)

If From = To then To = From (equality is symmetric)

Source
typeConstraints.scala
override
def liftCo[F[_]]: F[From] =:= F[To]
Definition Classes
Source
typeConstraints.scala
override
def liftContra[F[_]]: F[To] =:= F[From]

Lift this evidence over the type constructor F, but flipped.

Lift this evidence over the type constructor F, but flipped.

Definition Classes
Source
typeConstraints.scala
override
def substituteCo[F[_]](ff: F[From]): F[To]
Definition Classes
Source
typeConstraints.scala
override
def substituteContra[F[_]](ft: F[To]): F[From]
Definition Classes
Source
typeConstraints.scala

Inherited methods

def andThen[C](r: To <:< C): From <:< C

If From <: To and To <: C, then From <: C (subtyping is transitive)

If From <: To and To <: C, then From <: C (subtyping is transitive)

Inherited from
<:<
Source
typeConstraints.scala
override
def andThen[C](r: To => C): From => C
Definition Classes
Inherited from
<:<
Source
typeConstraints.scala
def compose[C](r: C <:< From): C <:< To

If From <: To and C <: From, then C <: To (subtyping is transitive)

If From <: To and C <: From, then C <: To (subtyping is transitive)

Inherited from
<:<
Source
typeConstraints.scala
override
def compose[C](r: C => From): C => To
Definition Classes
Inherited from
<:<
Source
typeConstraints.scala
override
Definition Classes
Inherited from
Function1
Source
Function1.scala