Here is an observation I've had from a chapter in Programming Scala.
In Scala, I often see the abstract trait pattern:
trait Abstract {
  type T
  def transform(x: T): T
  val initial: T
  var current: T
}
class Concrete extends Abstract {
  type T = String
  def transform(x: String) = x + x
  val initial = "hi"
  var current = initial
}
Why would I choose the abstract trait pattern over parameterized generics?
trait Abstract[T] {
  def transform(x: T): T
  val initial: T
  var current: T
}
class Concrete extends Abstract[String]{
  def transform(x: String): x + x
  val initial: "hi"
  var current: initial
}
 
    