获取实际类型的选项[任意]

时间:2013-05-31 00:27:33

标签: scala reflection

我有以下代码:

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的实际值类型?

1 个答案:

答案 0 :(得分:2)

  1. 您试图比较TypeTypeTag
  2. 编译器提供的Scala运行时反射信息,因此您需要将此类型信息添加到Property
  3. 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