Type Parameters and Generics
Bounded Type Parameter
Require a boxed generic value to provide a needed method.
Bounded Type Parameter
BoundedSize.scala
trait HasSize {
def size: Int
}
case class Label(text: String) extends HasSize {
def size: Int = text.length
override def toString: String = "[label]"
}
case class SizedBox[A <: HasSize](item: A)
object Main {
def main(args: Array[String]): Unit = {
val text =
val label = Label(text)
val box = SizedBox[Label](label)
val size = box.item.size
val doubled = size * 2
println("text=" + text)
println("size=" + size)
println("doubled=" + doubled)
}
}
trait HasSize {
def size: Int
}
case class Label(text: String) extends HasSize {
def size: Int = text.length
override def toString: String = "[label]"
}
case class SizedBox[A <: HasSize](item: A)
object Main {
def main(args: Array[String]): Unit = {
val text =
val label = Label(text)
val box = SizedBox[Label](label)
val size = box.item.size
val doubled = size * 2
println("text=" + text)
println("size=" + size)
println("doubled=" + doubled)
}
}
trait HasSize {
def size: Int
}
case class Label(text: String) extends HasSize {
def size: Int = text.length
override def toString: String = "[label]"
}
case class SizedBox[A <: HasSize](item: A)
object Main {
def main(args: Array[String]): Unit = {
val text =
val label = Label(text)
val box = SizedBox[Label](label)
val size = box.item.size
val doubled = size * 2
println("text=" + text)
println("size=" + size)
println("doubled=" + doubled)
}
}
upper-bound
An upper bound such as `A <: HasSize` says that `A` must provide the members from `HasSize`. `SizedBox[A]` can read `size` from its item safely.