有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Scala中POJO上的java模式匹配?

我正在尝试将一些旧的Scala代码更新为新的API

在我使用的一个库中,出于兼容性原因,一个case类已转换为一个简单的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) 个答案

  1. # 1 楼答案

    这是一个有点晚在这里的微妙,但

    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
        }
      }
    }
    
  2. # 2 楼答案

    @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是一种自命不凡的“原创”说法,但它只需要两个字母

  3. # 3 楼答案

    自己写unapply

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