Warum ist in verschachtelten Instanzen kein TypeTag verfügbar (wenn dies vom Scala-Code-Runner interpretiert wird)?
Ich versuche das Verhalten von zu ändernList.toString
entsprechend seinem Typparameter. Schon seitList
Kann nicht erweitert werden, wird von einer benutzerdefinierten Klasse umschlossenCList
(Könnte implizit sein, aber das Problem würde das gleiche bleiben?). Das Problem tritt beim Drucken von a aufCList
vonCList
s. Nachfolgend finden Sie Beispiele und entsprechende Ausgaben in Kommentaren:
object Foo {
import scala.reflect.runtime.universe._
class CList[A: TypeTag](val l: List[A]) {
override def toString = typeOf[A] match {
case t if t =:= typeOf[Char] => l.mkString
case _ => "[" + l.mkString(", ") + "]"
}
}
}
import Foo.CList
val c = new CList(List(1, 2)) // prints "[1, 2]"
println(c)
val c2 = new CList(List('a', 'b')) // prints "ab"
println(c2)
val c3 = new CList(List(
List(1, 2),
List(3, 4)))
println(c3) // prints "[List(1, 2), List(3, 4)]"
val c4 = new CList(List(
new CList(List(1, 2)),
new CList(List(3, 4))))
println(c4) // prints "No TypeTag available for this.Foo.C[Int]"