【发布时间】:2016-07-27 03:43:38
【问题描述】:
我正在使用 Scala 2.10,并且发现在对泛型参数使用类型推断时我认为奇怪的行为。考虑下面的例子(注意i 只是一个虚拟变量):
scala> import scala.reflect.{ClassTag,classTag}
|
| def broken[T : ClassTag](i : Int) : List[T] = {
| println("ClassTag is : " + classTag[T])
| List.empty[T]
| }
import scala.reflect.{ClassTag, classTag}
broken: [T](i: Int)(implicit evidence$1: scala.reflect.ClassTag[T])List[T]
scala> broken(3)
ClassTag is : Nothing
res0: List[Nothing] = List()
scala> val brokenVal : List[String] = broken(3)
ClassTag is : Nothing
brokenVal: List[String] = List()
调用broken(3) 似乎是一致的,因为函数内的打印语句与推断的ClassTag 一致。
但是,在第二个语句中,编译器为 ClassTag 推断出的并在函数内部打印的内容与实际返回类型之间存在不一致。
我本来希望编译器从类型声明中推断出ClassTag,即List[String]。这不正确吗?有人可以启发我吗?
这里有一些进一步的上下文:我实际上是在使用 classtag 来过滤某些代码中的集合(此处未显示),当我没有明确指定 T 时,它显然会失败,因为它与类型 @987654329 进行比较@。
【问题讨论】:
标签: scala generics reflection