Scala

From Celeste@Hoppinglife
Jump to navigation Jump to search

Type bounds

B <: U imposes a upper bound on type U, while B >: L imposes a lower bound. This is useful for generic methods that takes only classes on a particular inheritance tree as its type parameters.

The official tour has a pretty good explanation: Upper bounds and Lower bounds

Self Type

A trait with a self type cannot be used without mixed in that trait first.

trait User {
  def username: String
}

trait Tweeter {
  this: User =>  // reassign this
  def tweet(tweetText: String) = println(s"$username: $tweetText")
}

A question is how it is different from trait subclasses.

Context Bound

See Official tour, a discussion on the cake pattern and a StackOverflow question about this.

RAII and Resource Handling

Java and Scala do not have deterministic destructors due to automatic garbage collection. Java has a finalize() method in Object, but introduced problems and were deprecated. Java classes holding non-heap resources should provide a close method, as well as lean on Cleaner and Autoclosable to implement safe resource release.

For Scala, the best resource-management mechanism seems to be a library scala-arm.