2010-06-05 2 views
3

나는 아래이 가능 뭔가 같은지도 유형을 작성하고 싶습니다 :키와 값 모두에 대해 여러 유형을 허용하는지도 유형을 만드는 방법은 무엇입니까?

VariantMap(1) = "Test" 
VariantMap("a") = 42 

VariantMap("a")Option[Int]의 유형을 가질 것이다. 내가 뭔가를 분명 잃었 그래서 만약 내가 사과

object VariantMap { 
    import scala.reflect.Manifest 

    private var _map= Map.empty[Any,(Manifest[_], Any)] 

    def update[T](name: Any, item: T)(implicit m: Manifest[T]) { 
    _map = _map(name) = (m, item) 
    } 

    def apply[T](key:Any)(implicit m : Manifest[T]) = { 
    val o = _map.get(key) 

    o match { 
     case Some((om: Manifest[_], s : Any)) => Some[T](s.asInstanceOf[T]) 
     case _ => None 
    } 
    } 
} 

나는 스칼라에 새로 온 사람 : 여기에 지금까지 Option[Nothing]을 초래 한 코드입니다.

+0

키/값 유형의 고정 패턴이 있습니까? 또는 여러 가지 키 유형과 여러 가지 값 유형을 가질 수 있으며, 이전 유형 중 하나와 연관된 값 유형을 가질 수 있습니까? 아니면 아무것도하는 것입니까? 이 경우 Map [Any, Any]를 사용하고 나오는 값에 대/소문자로 일치 항목을 사용하십시오. –

답변

2

원하는대로 직접 할 수 있는지 확실하지 않습니다. 적용 메소드는 유형 매개 변수 [T]를 취하지 만 지정하지 않으면 컴파일러는 정확히 어떤 유형 T가 무엇인지 알 수 없습니다. 이 경우에는 다른 유형의 하위 유형 인 Nothing을 유추합니다. 모든 유형 중 하나를 정확하게 완벽하지, 괜찮습니다, 그래서 지금


scala> VariantMap[Int]("a") 
res0: Option[Int] = Some(1) 

scala> VariantMap[String]("a") 
res1: Option[String] = Some(1) 

:

유형 매개 변수를 공급하고, 코드를 사용하여 다음과 같은 결과가 있습니다. 당신은 약간 다음과 같은 변화로 개선 할 수 있습니다


object VariantMap { 
    import scala.reflect.Manifest 

    private var _map= Map.empty[Any,(Manifest[_], Any)] 

    def update[T](name: Any, item: T)(implicit m: Manifest[T]) { 
     _map = _map(name) = (m, item) 
    } 

    def apply[T](key:Any)(implicit m : Manifest[T]): Option[T] = { 
    val o = _map.get(key)  
    o match { 
     case Some((om: Manifest[_], s : Any)) => if (om None 
    } 
    } 
} 

scala> VariantMap("a") 
res0: Option[Nothing] = None 

scala> VariantMap[Int]("a") 
res1: Option[Int] = Some(1) 

scala> VariantMap[String]("a") 
res2: Option[String] = None 

아마 (이 단지 형 안전지도) 원하는 것을 정말도없는,하지만 난 정말이 순간에 더 나은 솔루션을 볼 수 없습니다 .

관련 문제