5

クラスでパターンマッチを行う必要があります。問題は、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)

インスタンスを持たずにクラスだけで同じように処理する方法はありますか?

4

2 に答える 2

4

その理由は、java.lang.LongLongが異なるクラスだからです。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]別々に処理する必要があります。おそらく、それらで何をする必要があるかを説明していただければ、特定のタスクに対するより良い解決策を見つけることができます.

于 2013-06-18T20:08:43.543 に答える