2010-03-20 2 views
1

java.lang.object를 반환하는 레거시 Java 코드로 작업하고 있습니다. 나는 함수로 전달 그리고 난 같은 몇 가지 암시 적 변환을하고 싶습니다 :Option [Object]를 Option [Int]로 암시 적으로 변환하십시오.

implicit def asInt(_in:Option[Object]) = _in asInstanceOf[ Option[Int] ] 
implicit def asDouble(_in:Option[Object] = _in asInstanceOf[ Option[Double] ] 

private def parseEntry(_name:String, _items:Map[String,Object]) = _name match{ 
    case docName.m_Constants => 
     new Constants(_items get(Constants m_Epsilon), _items get(Constant m_Rho), 
         _items get(Constants m_N)) 

기술적으로는 계속하지만 같은 오류가 점점 계속 : 예상 INT, 옵션 [오브젝트] 발견합니다. 여기에 문제의 집중된 스냅 샷이 있습니다 :

private def foo(_items:Map[String,Object]) ={ 
    val bar:Option[Int] = _items get("Bar") } 

어떻게 내 implicits를 잘못 했습니까? 나는 "asInstanceOf"를 매번 쓰지 않고 나를 대신하여 변화를 줄 수 있기를 바랬다.

+1

제쳐두고, 나는이 같은 암시 적 변환을 권장하지 않습니다. 암시 적 변환 내부에서 변환을 수행해야 할 때마다 권장 경로에서 벗어날 가능성이있는 신호로 사용해야합니다. –

+0

java.lang.object를 다룰 때 당신이 추천하는 것은 무엇입니까? – wheaties

+1

내가이 질문에 대답했다는 사실에도 불구하고 (나는 대답 할 수있는 질문이있을 때를 좋아한다.), 나는이 같은 암묵적인 타입 변환이 신중하게 사용되어야한다는 @Daniel에 동의한다. 물론 제네릭 형식 정보가없는 컬렉션을 반환하는 레거시 Java 코드로 작업 할 때와 같이 런타임 형식 검사 및 캐스팅을 피할 수없는 경우가 있습니다. 여전히 이러한 캐스트를 암시 적으로 만들면 일부 입력 (yay!)을 저장하지만 나중에 코드 클래스 사용자가 런타임 클래스 캐스트 예외 (boo!)의 위험을 알기가 더 어려워집니다. –

답변

2

암시 적 변환은 Option[Object]Option[Int]으로 변환하지만 ObjectOption[Int]으로 변환 할 것으로 예상되므로 암시 적 변환이 적용되지 않습니다.

시도 대신에 그냥 ObjectOption[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 맵을 사용한다면 여기에서 연결 해제에 대한 설명이됩니다.

+1

하지만지도에서 가져 오기 옵션 [B]를 반환합니다. http://www.scala-lang.org/docu/files/api/scala/collection/Map.html#get%28A%29를 참조하십시오. – wheaties

관련 문제