2

我有以下代码:

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 返回字符串:

scala> Property("test", Some("test")).value.get.getClass
res4: Class[_] = class java.lang.String

如何获取 Option[Any].get 的实际值类型?

4

1 回答 1

2
  1. 你试图比较TypeTypeTag
  2. 编译器提供的 Scala 运行时反射信息,因此您需要将此类型信息添加到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
于 2013-05-31T03:25:29.323 回答