2014-03-12 4 views
2

는 어떻게 이런 일이 가능하다 : 스칼라 유형 유추가 실패합니까?

import scala.util.{Try, Success} 
import reflect._ 

case class Foo[A](x: A) extends Dynamic { 

    def get[T: ClassTag]: Option[T] = Try(x.asInstanceOf[T]) match { 
    case Success(r) => Some(r) 
    case _ => None 
    } 
} 

object Foo extends App { 
    val test = Foo("hi") 
    val wtf: Option[Int] = test.get[Int] 
    assert(wtf.isInstanceOf[Option[String]]) 
    assert(wtf == Some("hi"))  // how???? 
    // val wtf2: Option[String] = wtf // does not compile even if above assert passes!! 
} 

이 질문에 의해 영감 : Scala check type of generics

답변

1
  1. 유형의 삭제로 인해, wtf.isInstanceOf[Option[String]]에만 유형 매개 변수를 wtfOption의 인스턴스인지 확인 할 수는 없지만. 마찬가지로 asInstanceOf[T]은 실제로 런타임시 Object에 캐스트되므로 성공합니다. 해야 할 일

    classTag[T].runtimeClass.cast(x) 
    

    대신에해야합니다.

  2. 컴파일러는 일 수있는 컴파일러를 상상할 수 있지만 스칼라는 그렇게 설계되지 않았습니다. wtf 유형이 Option[Int]이라는 것을 알고 있으므로 물론 Option[String]으로 초기화 할 수는 없습니다. 당신이 뭔가를 얻고 싶은 경우에, 당신은

    wtf match { 
        case wtf2: Option[String] => ... 
    } 
    

    은 물론,이 때문에 포인트에 제대로 작동하지 않습니다 필요 1.