Scala TypeTag的奇怪行为不显示类型参数

时间:2018-01-22 15:38:27

标签: scala

我有以下代码段:

import scala.reflect.runtime.universe._

def paramInfo[N: TypeTag](x: N): Unit = {
  val targs = typeOf[N] match { case TypeRef(_, _, args) => args }
  println(s"type of $x has type arguments $targs")
}

case class Dummy(l: List[Int])

import scala.reflect.runtime.universe._
paramInfo: [N](x: N)(implicit evidence$1: reflect.runtime.universe.TypeTag[N])Unit
defined class Dummy

// Exiting paste mode, now interpreting.

type of Dummy(List(1, 2)) has type arguments List()

scala> paramInfo(List(1,2))
type of List(1, 2) has type arguments List(Int)

scala> paramInfo(Dummy(List(1,2)))
type of Dummy(List(1, 2)) has type arguments List()

我不明白的是,我期待电话paramInfo(Dummy(List(1,2)))实际打印:

type of Dummy(List(1, 2)) has type arguments List(Dummy(List(Int)))

我弄错了吗?有什么原因吗?

编辑:在Dima的评论之后,我创建了一个通用的Dummy,这次我期待beList(Dummy(List(Int)))的类型参数,但它不是?为什么?

scala> case class Dummy[X](l: List[X])
defined class Dummy

scala> Dummy[Int](List(1,2))
res64: Dummy[Int] = Dummy(List(1, 2))

scala> paramInfo(res64)
type of Dummy(List(1, 2)) has type arguments List(Int)

1 个答案:

答案 0 :(得分:2)

因此,args中的TypeRef是类型参数列表。

Dummy没有类型参数,因此您返回一个空的List()List[Int]有一个类型参数 - Int - 因此,您将获得单个元素的列表,即Int

我不确定我理解为什么你期望看到你说的话,所以我无法帮助那些......你为什么期望Dummy成为自己的参数??? / p>

顺便说一下,你可以写一下你的match陈述:

 val TypeRef(_, _, targs) = typeOf[N]