2013-05-31 2 views
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 (свойство ("тест", Некоторые из них ("тест))) возвращает ложь, потому что getTypeTag (Property.value.get) возвращает Любой

Интересно, как я мог бы сделать это работает, потому что GetClass на значение возвращает строку:.

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

Как я могу получить фактический тип значения опции [Любой]. получить?

ответ

2
  1. Вы пытаетесь сравнить Type и TypeTag
  2. Информация
  3. 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 
+0

Спасибо, что работали , – abatyuk

Смежные вопросы