3

我正在尝试将一些旧的 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.

我可以在这里使用什么技巧吗?

提前致谢!

4

3 回答 3

3

It's a little late in the night here for subtlety, but

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
    }
  }
}
于 2014-11-10T08:55:03.933 回答
1

自己写unapply

object A {
    def unapply(x: A) = Some(x.getI)
}
于 2014-11-09T20:20:14.670 回答
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是一种自命不凡的方式来表达“原创”,但它只需要两个字母。

于 2014-11-19T09:58:27.833 回答