2014-05-12 1 views
3

변경 가능한 맵을 닫힌 스코프 내부의 불변의 맵으로 변환하고 싶습니다. 여기에 상황과 말도 안되는 방어 사본의 샘플 코드는 : 나는 변경할지도가 외부에서 실제로 불변이기 때문에 완전히, 낭비 여기 방어 사본을하고, "넌센스"을 썼던 것처럼복사 할 수없는 변경 가능한 맵을 만드는 방법

def func(): immutable.Map[String, Int] = { 
    val map = mutable.HashMap[String, Int] 
    // here goes operations for the map 
    return immutable.HashMap ++ map 
} 

. 외부에서 얻을 수있는 게터 작업 만 수행 할 수 있다면 성능 향상에 도움이됩니다.

문제는 내가 실제로 어떻게 해야할지 모르겠다는 것입니다. 난 익명 불변의지도 인스턴스에 의해 간단하게 그것을 포장하려했지만, 방법 def +[B1 >: B](kv: (A, B1)) 불가능합니다.

도와주세요!

편집 :

def func(): collection.Map[Int, Int] = { 
    val map = mutable.HashMap[String, Int] 
    // here goes operations for the map 
    return map 
} 

사용자가 mutable.Map에 캐스팅 수 : 당신이 collection.mutable.Mapcollection.immutable.Map의 공통 상위 유형 인, 단순히 collection.Map을 반환 할 수 있습니다 [String, Int]

답변

6

에 반환 유형 [Int, Int]를 해결하는 것을 잊었다 그러나 복사를 피하는 임의의 솔루션에 반영하여 변경 가능한지도를 가져올 수도 있고 복사 할 때도 변경할 수없는지도를 변경할 수 있습니다.

+0

나는 반환 된지도를 불변의지도로하고 싶지만, collection.Map 역시 불변으로 보인다. 나는 너무 혼란 스럽다 ... 불변의 것을 말해 줄 수 있겠습니까. 상속을 받음으로지도가됩니다. 괜찮 으면지도 해봐? :/ –

+0

@AlexeyRomanov Brilliant! 짧고 요점. 때로는 컬렉션 라이브러리가 너무 복잡하고 너무 많은 특성을 포함하고 있지만이를보고 이해합니다. – wheaties

+1

@RyoichiroOka 그들은 (기본적으로) 동일한 API를 가지고 있습니다. 'immutable.Map'은 실제로 불변합니다 (언급 된 것처럼 반사를 사용하지 않는 것); 'collection.Map'은 변경 가능하거나 변경 불가능할 수 있습니다 (그러나 변경할 수있는 경우에도이를 변환하지 않고 변경 메소드에 액세스 할 수 없습니다). –

관련 문제