我有以下代码:
case class Property(name: String, value: Option[Any])
class PropertyType[+T <: Any: ru.TypeTag] {
def isValidType(property: Property): Boolean = {
property.value match {
case None => true
case Some(value) => ru.typeOf[T] == getTypeTag(value)
}
}
private def getTypeTag[TT: ru.TypeTag](obj: TT) = ru.typeTag[TT]
}
case object StringPropertyType extends PropertyType[String]
当然,StringPropertyType.isValidType(Property(“test”,Some(“test)))返回false,因为getTypeTag(Property.value.get)返回Any。
我想知道如何让它工作,因为getClass on value返回String:
scala> Property("test", Some("test")).value.get.getClass
res4: Class[_] = class java.lang.String
如何获得Option [Any] .get的实际值类型?
答案 0 :(得分:2)
Type
和TypeTag
Property
import scala.reflect.runtime.{universe => ru}
case class Property[T](name: String, value: Option[T])
class PropertyType[+T <: Any: ru.TypeTag] {
def isValidType[S: ru.TypeTag](property: Property[S]): Boolean = {
property.value match {
case None => true
case Some(value) => ru.typeTag[S].tpe <:< ru.typeOf[T]
}
}
}
case object StringPropertyType extends PropertyType[String]
println(StringPropertyType.isValidType(Property("test", Some("test")))) // true