2013-12-12 2 views
1

동적으로 변수를 캐스팅하고 싶습니다. Option[T]. 의미는 변수 xT 유형과 일치하는 경우 캐스팅은 Some(x)을 반환하고 그렇지 않으면 None을 반환해야합니다. 단일 맵 호출을 사용하면 과 함께 제공된 isInstanceOf[T]을 사용하거나 괴물 케이스 스위치를 만드는 것보다 훨씬 깔끔합니다.변수를 동적으로 캐스트하는 방법 Option

나는

object OptionCast { 
    def apply[T](source : Any) : Option[T] = source match { 
    case s : T => Some(s) 
    case _ => None 
    } 
} 

아래의 간단한 코드를 시도했다하지만 실제로 유형을 무시 : OptionCast[Int]("some").map(_ + 2) 나에게 타입 에러를 제공합니다.

이 코드를 어떻게 다시 작성해야합니까?

+0

try : source : T 대신? –

+0

@StefanKunze 입력 결과가 아닌 적용 결과 유형이 지워지는 문제 (Option [T]) –

+0

모든 유형의 캐스트에 동적 캐스트가 필요합니다. – ayvango

답변

4

코드의 문제는 T이 삭제된다는 것입니다. 바이트 코드의 메소드에는 유형 매개 변수가 없으므로, 은 Object으로 지워지고 모든 경우에 대해 true가됩니다. 일부 제한

이 작동 :

import scala.reflect.ClassTag 
object OptionCast { 
    def apply[T : ClassTag](source : Any) : Option[T] = source match { 
    case s : T => Some(s) 
    case _ => None 
    } 
} 

여기에 두 가지 중요한 제한이 있습니다 삭제됩니다 유형 매개 변수는 런타임 때문에

  1. 그것은 형식 매개 변수를 확인할 수 없습니다가. 즉 OptionCast.apply[List[Int]](List("a"))으로 전화하면 Some(List("a"))이 반환됩니다. 이 문제를 해결하려면 유형 삭제를해야합니다.
  2. AnyVal 클래스는 박스로 처리되므로 java.lang.Integer을 확인하여 Int 등을 찾아야합니다.