Для следующего класса случаев:
scala> case class Foo[T](name: String) {}
defined class Foo
scala> val foo = Foo[Int]("foo")
foo: Foo[Int] = Foo(foo)
Почему Scala позволяет мне, как мне кажется, сопоставлять Foo[Int]
? Разве Int
не стерто?
scala> foo match {
| case _: Foo[Int] => "foo"
| case _ => "bar"
| }
res2: String = foo
Но это показывает ошибку времени компиляции при включении другого случая совпадения с образцом?
scala> foo match {
| case _: Foo[String] => "string"
| case _: Foo[Int] => "int"
| case _ => "other"
| }
<console>:12: warning: non-variable type argument String in type pattern Foo[String] is unchecked since it is eliminated by erasure
case _: Foo[String] => "string"
^
<console>:12: error: pattern type is incompatible with expected type;
found : Foo[String]
required: Foo[Int]
case _: Foo[String] => "string"
^
Foo
попадает в то же ведро, что иList
согласно этому вопрос. Опять же, я думаю, но не совсем уверен. - person Kevin Meredith   schedule 13.01.2015