5

我正在尝试List.toString根据其类型参数修改其行为。由于List无法扩展,因此它由自定义类包装CList(可能带有隐式,但问题会保持不变?)。打印 a CListof CLists 时出现问题。以下是评论中的示例和相应的输出:

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]"
4

2 回答 2

9

我能够将代码简化为:

import scala.reflect.runtime.universe.TypeTag
class A
implicitly[TypeTag[A]]

当它与 scala 解释器一起运行时,它会给出一个错误No TypeTag available for this.A。查看解释器生成的代码,我想出了编译器无法处理的代码:

class Main {
  class A
  def main(args: Array[String]) {
    class B
    implicitly[TypeTag[A]] // ok
    implicitly[TypeTag[B]] // error
  }
}

因此,编译器似乎无法为定义在方法中的类生成类型标签。-Xlog-implicits带着抱怨跑cannot create a TypeTag referring to local class Main.B: use WeakTypeTag instead

于 2013-09-18T11:29:46.643 回答
2

对我有用,scala 2.10.2,输出是:

[1, 2]
ab
[List(1, 2), List(3, 4)]
[[1, 2], [3, 4]]
于 2013-09-18T08:48:56.897 回答