Skip to content

Instantly share code, notes, and snippets.

@retronym
Created December 16, 2009 11:17
Show Gist options
  • Select an option

  • Save retronym/257758 to your computer and use it in GitHub Desktop.

Select an option

Save retronym/257758 to your computer and use it in GitHub Desktop.
Tour of Scala Type Bounds
//
// Upper Type Bound
//
def upperTypeBound[AA <: A](x: AA): A = x
// equivalently, require a implicit parameter of <:<[AA, A].
// This technique must be used if A is an abstract type from the
// enclosing scope.
def upperTypeBound2[AA](x: AA)(implicit ev: AA <:< A): A = x // compiles to ev(x)
//
// Lower Type Bound
//
def lowerTypeBound[AA :> A](x: AA, pred: (AA => Boolean)): Boolean = pred(x)
// equivalently, require a implicit parameter of <:<[A, AA].
// This technique must be used if A is an abstract type from the
// enclosing scope.
def lowerTypeBound2[AA :> A](x: AA, pred: (AA => Boolean))(implicit ev: A <:< AA): Boolean = pred(x)
//
// View Bound
//
def viewBound[AA <% A](x: AA): A = x
//compiles to:
def viewBound$[AA](x: AA)(implicit ev1$: AA => A) = ev1$(x)
//
// Context Bound
//
def contextBound[X: B](x: X)
//compiles to:
def contextBound$[X](x: X)(implicit ev1$: B[X])
@razie
Copy link

razie commented Aug 17, 2010

this is the very definition of "screwy"...

@jppellet
Copy link

Great summary and reference. It shows that multiple view and context bounds are possible, but this does not work with upper bounds and lower bounds. I believe multiple upper bounds can be specified with with: [A <: B with C], and multiple lower bounds are discussed there: http://stackoverflow.com/questions/6117999/multiple-lower-type-bounds-in-scala

Could you add such examples for completeness's sake?

@dcsobral
Copy link

I'd like to see some example of "abstract type from the enclosing scope".

@hseeberger
Copy link

Me, too! ("I'd like to see some example of "abstract type from the enclosing scope")

@retronym
Copy link
Author

trait M[A] {
   def a: A
   def inc(implicit A <:< Int): Int = 1 + a
}

@hseeberger
Copy link

Thanks!
A little bug, though ;-)
Fixed:

trait M[A] {
   def a: A
   def inc(implicit ev: A <:< Int): Int = 1 + a
}```

@przemyslawsokol
Copy link

I know this Gist is pretty old, but just to point out for further audience... A <% B (view bound) has been deprecated in Scala 2.11. Check SI-7629 issue and discussion for more details.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment