我试图将一些旧的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
。
我可以在这里使用任何技巧吗?
提前致谢!
答案 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)
import spray.httpx.{UnsuccessfulResponseException => UrUnsuccessfulResponseException}
object UnsuccessfulResponseException {
def unapply(a: UrUnsuccessfulResponseException): Option[HttpResponse]
= Some(a.response)
}
... match {
case Failure(UnsuccessfulResponseException(r)) => r
case ...
}
Ur
是一种自命不凡的说法"原创",但它只需要两个字母。