Соответствующие подклассы case-классов в Scala - PullRequest
4 голосов
/ 14 января 2010

Почему это не компилируется (или не работает?):

  case class A(x: Int)
  class B extends A(5)

  (new B) match {
    case A(_) => println("found A")
    case _ => println("something else happened?")
  }

Ошибка компилятора:

constructor cannot be instantiated to expected type;  found   : blevins.example.App.A  required: blevins.example.App.B

Обратите внимание, что это компилируется и работает как ожидалось:

  (new B) match {
    case a: A => println("found A")
    case _ => println("something else happened?")
  }

ДОПОЛНЕНИЕ

Просто для справки, он компилируется и работает нормально:

  class A(val x: Int)
  object A {
    def unapply(a: A) = Some(a.x)
  }
  class B extends A(5)

  (new B) match {
    case A(i) => println("found A")
    case _ => println("something else happened?")
  }

1 Ответ

4 голосов
/ 14 января 2010

Это работает, по крайней мере, в 2.8:

scala>   case class A(x: Int)                           
defined class A

scala>   class B extends A(5)                           
defined class B

scala>   (new B: A) match {                             
     |     case A(_) => println("found A")              
     |     case _ => println("something else happened?")
     |   }                                              
found A

Я не нашел указатель на конкретную ошибку, которая вызывает исходную проблему, но игнорирую предупреждения о наследовании класса case на свой страх и риск.

...