为什么我的例子中List [String]匹配List [Int]虽然我传递了Manifest?

时间:2016-02-26 08:29:52

标签: scala jvm

object Main extends App {
  def foo[A](somelist: List[A])(implicit m: Manifest[A]): String = somelist match {
    case _ : List[Int] => "we have a list of int!"
    case _ => "have no idea what this list is"
  }
}
Main.foo(List[String]("somestring"))

结果:

res0: String = we have a list of int!

我确信Manifest的全部目的是将信息传递给JVM为什么这不起作用? (PS我知道TypeTag是更新的方式我想用Manifest来尝试。

感谢

2 个答案:

答案 0 :(得分:1)

Manifest[A]在模式匹配中的唯一用途是允许您与A匹配:

somelist match {
  case _: A => ...
  case _ => ...
}

不反对任何你想要的类型。

答案 1 :(得分:1)

因为事实证明存在Predef manifest定义,因此您应该以下列方式将m仅与此预先清单进行比较

object Main extends App {
  println(Main.foo(List[String]("fkdjfkdj")))

  def foo[A](somelist: List[A])(implicit m: Manifest[A]): String = {
    if (m <:< manifest[String]) {
      "its a string"
    } else {
      "its not a string"
    }
  }
}

正确产生:

“它是一个字符串”

和int

object Main extends App {
  println(Main.foo(List[Int](1)))

  def foo[A](somelist: List[A])(implicit m: Manifest[A]): String = {
    if (m <:< manifest[String]) {
      "its a string"
    } else {
      "its not a string"
    }
  }
}

its not a string