암시 적 변환은 Option[Object]
을 Option[Int]
으로 변환하지만 Object
을 Option[Int]
으로 변환 할 것으로 예상되므로 암시 적 변환이 적용되지 않습니다.
시도 대신에 그냥 Object
의 Option[Object]
을 얻을에 암시 적 변환의 차기 있는지 Some()
와 _items get("Bar")
포장
편집 :.는 사실, 나는이 당신을 위해 작동하지 않는 이유를 모르겠어요 , 당신이 당신의 코멘트에서 정확하게 지적했듯이, 스칼라 맵은 반환 옵션을 매핑합니다. (참고
import java.util.Map
import java.util.HashMap
object ImplicitConversions {
implicit def asInt(_in:Option[Object]) = _in.asInstanceOf[Option[Int]]
implicit def asDouble(_in:Option[Object]) = _in.asInstanceOf[Option[Double]]
private def foo(_items:Map[String,Object]) = {
val intermediate = Some(_items.get("Bar"))
val bar:Option[Int] = intermediate
println(bar.get.intValue)
}
def main(args: Array[String]) {
val map:Map[String,Object] = new HashMap[String, Object]
map.put("Bar", Integer.valueOf(37))
foo(map)
}
}
: 다음 Some()
작품 포장, 자바지도를 사용하는 경우,
import scala.collection.mutable.Map
import scala.collection.mutable.HashMap
object ImplicitConversions {
implicit def asInt(_in:Option[Object]) = _in.asInstanceOf[Option[Int]]
implicit def asDouble(_in:Option[Object]) = _in.asInstanceOf[Option[Double]]
private def foo(_items:Map[String,Object]) = {
val bar:Option[Int] = _items.get("Bar")
println(bar.get.intValue)
}
def main(args: Array[String]) {
val map:Map[String,Object] = new HashMap[String, Object]
map.put("Bar", Integer.valueOf(37))
foo(map)
}
}
그러나 다음 코드는 내가 그것을 기대하는 것처럼, 저와 인쇄 "37"를 작동 변환을 얻으려면 중급 변수에 Some()
의 결과를 저장해야했습니다. 아마도 스칼라 전문가가 중간 단계를 피하는 방법을 보여줄 수 있습니다. ;-))
스칼라와 자바지도가 섞여있다. 당신의 코드? 레거시 Java 코드를 호출한다고 말했습니까?이 때문에 처음부터이 모든 암시 적 변환을 수행해야했습니다. 스칼라 맵을 사용하고 있다고 생각할 때 Java 맵을 사용한다면 여기에서 연결 해제에 대한 설명이됩니다.
제쳐두고, 나는이 같은 암시 적 변환을 권장하지 않습니다. 암시 적 변환 내부에서 변환을 수행해야 할 때마다 권장 경로에서 벗어날 가능성이있는 신호로 사용해야합니다. –
java.lang.object를 다룰 때 당신이 추천하는 것은 무엇입니까? – wheaties
내가이 질문에 대답했다는 사실에도 불구하고 (나는 대답 할 수있는 질문이있을 때를 좋아한다.), 나는이 같은 암묵적인 타입 변환이 신중하게 사용되어야한다는 @Daniel에 동의한다. 물론 제네릭 형식 정보가없는 컬렉션을 반환하는 레거시 Java 코드로 작업 할 때와 같이 런타임 형식 검사 및 캐스팅을 피할 수없는 경우가 있습니다. 여전히 이러한 캐스트를 암시 적으로 만들면 일부 입력 (yay!)을 저장하지만 나중에 코드 클래스 사용자가 런타임 클래스 캐스트 예외 (boo!)의 위험을 알기가 더 어려워집니다. –