Scala:如何模式匹配scala.Long和java.lang.Long

我需要在Classes上进行模式匹配.问题是,我有一些匹配Long的问题.

我需要以相同的方式处理scala.Long和java.lang.Long,但为什么我需要在两种情况下声明它们?

这是一个例子:

def test(typ: Class[_]) {
    typ match {
      case q if q == classOf[Long] => println("scala long...")
    }
  }

  val scalaLongField: java.reflect.Field = ......
  val javaLongField: java.reflect.Field = ......
  test(scalaLongField.getType) // prints "scala long..."
  test(javaLongField.getType) // scala.MatchError: class java.lang.Long (of class java.lang.class)

有没有办法处理它们没有实例而只有类?

解决方法

原因是java.lang.Long和Long是不同的类.在Java中,java.lang.Long.class和Long.TYPE之间存在差异.同样,在Scala中,classOf [Long]和classOf [java.lang.Long]是不同的.

如果要对类进行模式匹配,可以为此创建帮助器unapply方法

object ScalaLong {
  // Internal helper:
  private def matchClass[T](c: Class[_],as: Class[T]): Option[Class[T]] =
    if (as.isAssignableFrom(c)) Some(as)
    else None;

  // Matches wrapped Long classes.
  object LongObject {
    def unapply(c: Class[_]): Option[Class[java.lang.Long]] =
      matchClass(c,classOf[java.lang.Long]);
  }
  // Matches primitive long classes.
  object LongPrim {
    def unapply(c: Class[_]): Option[Class[Long]] =
      matchClass(c,classOf[Long]);
  }

  // -- Test:

  def check(clz: Class[_]) =
    clz match {
      case LongPrim(c)   => println("Long primitive: " + c);
      case LongObject(c) => println("Long object: " + c);
      case _             => println("Other: " + clz);
    }


  class Example {
    val l1: scala.Long = 1L;
    val l2: java.lang.Long = 1L;
    val l3: java.lang.Integer = 1;
  }

  def main(argv: Array[String]) {
    for(name <- Seq("l1","l2","l3"))
      check(classOf[Example].getmethod(name).getReturnType());
  }
}

通常,您必须分别处理classOf [Long]和classOf [java.lang.Long].也许,如果你描述了你需要做什么,我们可以为你的具体任务找到更好的解决方案.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...