4

これがコンパイルに失敗する (または動作する) のはなぜですか?

  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?")
  }
4

1 に答える 1

4

これは、少なくとも 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

元の問題を引き起こした特定のバグへのポインターは見つかりませんでしたが、ケース クラスの継承に関する警告は無視してください。

于 2010-01-13T22:37:57.077 に答える