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 vonCLists. 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]"

Antworten auf die Frage(2)

Ihre Antwort auf die Frage