【问题标题】:Pattern matching on POJOs in Scala?Scala中POJO的模式匹配?
【发布时间】:2014-11-09 20:05:47
【问题描述】:

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

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

提前致谢!

【问题讨论】:

    标签: java scala scala-2.11


    【解决方案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】:

    自己写unapply

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

    【讨论】:

    • 嗯...现在这看起来很有趣。你确定这应该有效吗?我遇到了一些真正的奇异错误,例如 constructor is defined twice conflicting symbols...constructor not allowed hereself constructor arguments cannot reference unconstructed this。让我和他们一起玩,让我们看看我能走多远:-)
    • @som-snytt 谢谢,但我的问题不在于unapply() :-) 你有没有试过编译上面A 是POJO 的东西?
    • 你不能在 scala 的单独文件中定义同伴,更不用说 java 互操作了。否则,提取器名称是任意的。见stackoverflow.com/questions/4921827/…
    【解决方案3】:

    @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 是一种自命不凡的方式来表达“原创”,但它只需要两个字母。

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 2016-05-17
      • 2021-12-17
      • 2016-03-29
      • 2019-05-26
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多