2013-05-31 6 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 (속성 ("테스트", 일부 ("테스트))) false를 반환을하기 때문에 getTypeTag (Property.value.get)는 어떤을 반환

내가 getClass 값에 문자열을 반환하기 때문에 그것이 작동 할 수 있는지 궁금 :.

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

어떻게 옵션 [모든]의 실제 값 유형을 얻을 수 있습니다. ~

,

답변

2
  1. 당신은 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

덕분에 이러한 유형의 정보를 추가 할 필요가 TypeTypeTag 컴파일러에 의해 제공

  • 스칼라 런타임 반사 정보, 그래서 비교하기 위해 노력하고, 그 일을 . – abatyuk