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