2016-08-29 4 views
0

그래서 유형을 검사하여 키 값을 리턴하는 암시 적 메소드를 추가하려고합니다. 나는 시도하고이를 컴파일 할 때스칼라 맵에 암시 적 getAs() 메소드 추가하기

import scala.reflect.ClassTag 

object MyMap { 
    implicit class FlexMap[A](map: Map[String, A]) { 
    def getAs[B](key: String)(implicit ct: ClassTag[B]): Option[B] = map.get(key) match { 
     case Some(value: ct.runtimeClass) => Some(value.asInstanceOf[B]) 
     case _ => None 
    } 
    } 
} 

는하지만, 내가 얻을 :

형 runtimeClass 내가 같은 오류가 scala.reflect.ClassTag [B]

의 구성원이 아닌 비록 내가 사용하더라도 :

case Some(value) if (value.isInstanceOf[ct.runtimeClass]) 

나는 이것을 회피하는 방법을 모르겠다. 어떤 아이디어?

답변

0

스칼라에서는 유형이 값이 아니며 유형이 서로 다르므로 메서드에서 유형을 반환 할 수 없습니다. .runtimeClass은 실제로 유형이 예상되는 곳에서는 사용할 수없는 Class 유형의 값을 반환합니다. 당신이 아마 필요한 것은이 :

object MyMap { 
    implicit class FlexMap[A](map: Map[String, A]) { 
    def getAs[B](key: String)(implicit ct: ClassTag[B]): Option[B] = map.get(key) match { 
     case Some(value: B) => Some(value) 
     case _ => None 
    } 
    } 
} 

같은 일을 말하는 또 다른 방법 :

def getAs[B](key: String)(implicit ct: ClassTag[B]): Option[B] = 
    map.get(key) flatMap { 
    case value: B => Some(value) 
    case _  => None 
    } 
+0

이 컴파일되지만, 스칼라는'Any'를'Int'로 해석하지 못합니다. 어쩌면 예상되는 행동 일 수도 있지만 작동하게하려면 어떻게해야합니까? 이것이 내가 의미하는 바입니다. 'Map [String, Any] ("foo"-> 1) .getAs [Int] ("foo")'는'None'을 반환합니다. – aa8y

+0

당신의 스 니핏은 나를 위해'Option [Int] = Some (1)'을 반환합니다. (2.11.8) –

+0

2.10에서는 작동하지 않는 것처럼 보이지만 2.11에서는 보이게됩니다. – aa8y

1

ClassTag 당신을 위해 실제 캐스팅 작업을 않는 unapply 방법이 있고, 옵션을 반환합니다.

implicit class FlexMap[A](map: Map[String, A]){               
    def getAs[B](key: String)(implicit ct: ClassTag[B]): Option[B] = 
    map.get(key).flatMap(ct.unapply)  
}                          
+0

정확히 스칼라가 내 사례에서 '사례'를 확장하여 수행하고있는 작업입니다. 나는 그것이 너무 낮은 수준이라고 생각해야 할까? –

+0

이것은 컴파일되지만, 스칼라는'Any'를'Int'로 해석하지 못합니다. 어쩌면 예상되는 행동 일 수도 있지만 작동하게하려면 어떻게해야합니까? 이것이 내가 의미하는 바입니다. 'Map [String, Any] ("foo"-> 1) .getAs [Int] ("foo")'는'None'을 반환합니다. – aa8y

+0

아, 'AnyVal' 유형과'ClassTag'의 적용 취소에 대한 이상한 의미가 있다고 생각합니다. 이 문제를 해결하기 위해 몇 가지 조사를해야 할 것입니다. – Dylan