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
}