case class PrintFormatter[T](item : T) { def formatString(implicit evidence: T =:= String) = { // Will only work for String PrintFormatters println("STRING specialised printformatting...") } def formatPrimitive(implicit evidence: T <:< AnyVal) = { // Will only work for Primitive PrintFormatters println("WRAPPED PRIMITIVE specialised printformatting...") } } val stringPrintFormatter = PrintFormatter("String to format...") stringPrintFormatter formatString // stringPrintFormatter formatPrimitive // Will not compile due to type mismatch val intPrintFormatter = PrintFormatter(123) intPrintFormatter formatPrimitive // intPrintFormatter formatString // Will not compile due to type mismatch