Scala:如何模式匹配scala.Long和java.lang.Long
发布时间:2020-12-16 09:57:38 所属栏目:安全 来源:网络整理
导读:我需要在Classes上进行模式匹配.问题是,我有一些匹配Long的问题. 我需要以相同的方式处理scala.Long和java.lang.Long,但为什么我需要在两种情况下声明它们? 这是一个例子: def test(typ: Class[_]) { typ match { case q if q == classOf[Long] = println(
我需要在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].也许,如果你描述了你需要做什么,我们可以为你的具体任务找到更好的解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |