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.