스칼라 ClassTags 작업 AnyVal 객체와 함께 사용할 때 classTag.runtimeClass.isInstance가 제대로 작동하지 않습니다. 다음은 테스트 할 수있는 스 니펫입니다. AnyVal 오브젝트에 대해이 작업을 수행하기위한 아이디어가 있습니까?AnyVal에 대해 ClassTag.runtimeClass.isInstance가 작동하지 않습니다.
val c = classTag[Double].runtimeClass
println(c) // double
println(c == classOf[Double]) // true
println(c.isInstance(0.0)) // false
isInstance
가 Object
을 취
import scala.reflect.ClassTag
import scala.reflect.runtime.{universe => ru}
object Test {
def extractField[U: ru.TypeTag](json: Map[String, Any], field: String)(implicit classTag: ClassTag[U]): Option[U] = {
json.get(field) match {
case Some(value) =>
if(classTag.runtimeClass.isInstance(value))
Some(value.asInstanceOf[U])
else {
None
}
case _ =>
None
}
}
val map: Map[String,Any] = Map("k1" -> 2.0, "k2" -> "v")
extractField[Double](map,"k1") // RETURNS NONE
extractField[String](map,"k2") // RETURNS Some("v")
}
은 BTW 나는 여기에 같은 문제를 보여주는 훨씬 간단 코드는 스칼라 2.10
이것은 스칼라 버그입니까? – Mikel
isInstance 대신 isInstanceOf를 사용하십시오. http://stackoverflow.com/questions/26168721/difference-between-isinstance-and-isinstanceof – Samar
일반 유형이기 때문에 value.isInstanceOf [U]를 사용할 수 없으므로 classtag 사용 (value.isInstanceOf [U]는 지우기로 인해 제거되므로 선택 취소됩니다.) – Mikel