Scala中POJO的模式匹配?

时间:2014-11-09 20:05:48

标签: java scala scala-2.11

我试图将一些旧的Scala代码更新为新的API。

在我使用的其中一个库中,出于兼容性原因,案例类已转换为简单的POJO。

我想知道是否仍然可以以某种方式为Java类使用模式匹配。

想象一下,我有一个简单的Java类,如:

public class A {
    private int i;

    public A(int i) {
        this.i = i;
    }

    public int getI() {
        return i;
    }
}

编译之后,我想在模式匹配中使用它,如:

class Main extends App {
    val a = ...

    a match {
        case _ @ A(i) =>
            println(i);
    }
}

对于上面的代码,我显然会收到错误:Main.scala:7: error: object A is not a case class constructor, nor does it have an unapply/unapplySeq method

我可以在这里使用任何技巧吗?

提前致谢!

3 个答案:

答案 0 :(得分:2)

这里有一点点深夜的细微之处,但是

object `package` {
  val A = AX
}

object AX {
  def unapply(a: A): Option[Int] = Some(a.getI)
}

object Test extends App {
  Console println {
    new A(42) match {
      case A(i) => i
    }
  }
}

答案 1 :(得分:1)

自己写unapply

object A {
    def unapply(x: A) = Some(x.getI)
}

答案 2 :(得分:1)

@ som-snytt的答案是正确的 - 但如果你这样做只是为了模式匹配然后我更喜欢更简洁的方法:

import spray.httpx.{UnsuccessfulResponseException => UrUnsuccessfulResponseException}

object UnsuccessfulResponseException {
  def unapply(a: UrUnsuccessfulResponseException): Option[HttpResponse]
    = Some(a.response)
}

... match {
  case Failure(UnsuccessfulResponseException(r)) => r
  case ...
}

Ur是一种自命不凡的说法"原创",但它只需要两个字母。