삭제 비가. 따라서 런타임에 유형 A는 더 이상 알 수 없으며 asInstanceOf[A]
은 no-op로 컴파일됩니다. 컴파일러는 결과 값이 A 유형이지만 실제로 런타임에서는 보장되지 않는다고 생각합니다.
스칼라의 매니 페스트를 사용하여 문제를 해결할 수 있습니다. 불행하게도 JVM은 기본 유형/복싱을 처리하여 추가 작업을 수행해야합니다.
유형의 "약한 적합성"을 처리하지는 않지만 다음 작업은 다음과 같이 작동합니다. Int는 Long으로 간주되지 않으므로 cast[Long](42)
은 None
을 반환합니다. 그것과 같을 것이다 대신 검증의 옵션을
import scala.reflect.runtime.universe._
def as[T: TypeTag](term: Any): ValidationNEL[String, T] =
if (reflect.runtime.currentMirror.reflect(term).symbol.toType <:< typeOf[T])
term.asInstanceOf[T].successNel[String]
else
("Cast error: " + term + " to " + typeOf[T]).failNel[T]
:
def cast[A : Manifest](value: Any): Option[A] = {
val erasure = manifest[A] match {
case Manifest.Byte => classOf[java.lang.Byte]
case Manifest.Short => classOf[java.lang.Short]
case Manifest.Char => classOf[java.lang.Character]
case Manifest.Long => classOf[java.lang.Long]
case Manifest.Float => classOf[java.lang.Float]
case Manifest.Double => classOf[java.lang.Double]
case Manifest.Boolean => classOf[java.lang.Boolean]
case Manifest.Int => classOf[java.lang.Integer]
case m => m.erasure
}
if(erasure.isInstance(value)) Some(value.asInstanceOf[A]) else None
}
문자열에 정수 값을 캐스팅하면 예외가 발생하고 메서드는 없음을 반환해야하지만 그렇지 않은 경우가 있습니다. 스칼라 2.9.0-1을 사용합니다. –
예, 일부 (2)를 반환하지만 ...하지 않습니다. 값을'get '하려고하면 예외가 발생하지만'getOrElse'는 괜찮습니다. –
예, 캐스트 메서드에서 예외가 발생할 것으로 예상했습니다. –