2014-05-22 2 views
0

스칼라가 왜 유추 할 수있는 것들을 허용하지 않는지 매우 혼란 스럽습니다. 임의의 타입을 맵에 저장하고 싶다면 가능해야하지만 작업을 수행하기에 충분한 정보가있는 곳에서는 차단되어야한다고 상상해보십시오.스칼라 맵을 사용하는 방법

scala> var m: Map[Any, Any] = Map() 
m: Map[Any,Any] = Map() 

scala> m = ("one" -> 1, 2 -> "two", 3 -> 3) 
<console>:8: error: type mismatch; 
found : ((String, Int), (Int, String), (Int, Int)) 
required: Map[Any,Any] 
     m = ("one" -> 1, 2 -> "two", 3 -> 3) 
     ^

scala> m += ("one" -> 1) 

scala> m += (2 -> "two") 

scala> m += (3 -> 3) 

scala> m 
res25: Map[Any,Any] = Map(one -> 1, 2 -> two, 3 -> 3) 

scala> m("one").getClass 
res26: Class[_] = class java.lang.Integer 

scala> m(3).getClass 
res27: Class[_] = class java.lang.Integer 

scala> val result = m("one")+m(3) 
<console>:8: error: type mismatch; 
found : Any 
required: String 
     val result = m("one")+m(3) 
          ^

scala> val result: Int = m("one")+m(3) 
<console>:8: error: type mismatch; 
found : Any 
required: String 
     val result: Int = m("one")+m(3) 
           ^

scala> val mr1 = m("one") 
mr1: Any = 1 

scala> val mr1 = m("one") => Int 
<console>:1: error: not a legal formal parameter. 
Note: Tuples cannot be directly destructured in method or function parameters. 
     Either create a single parameter accepting the Tuple1, 
     or consider a pattern matching anonymous function: `{ case (param1, param1) => ... } 
     val mr1 = m("one") => Int 
       ^

는 궁극적으로 나는 키 (문자열)의 유형을 알고, 그 값의 실제 유형을 알 수 있기 때문에, 나는 적어도 오른쪽을 캐스팅 할 수 있어야한다? 나는 또한 코드가 타입 안전해야한다는 것을 알고있다.

분명히 여기있는 대부분의 오류와 재판을하고 있습니다. 누구든지 안내를 제공 할 수 있습니까?

답변

3

당신은 너무 오른쪽이 Map[Any, Any]와 호환되어야합니다 m에 할당하려고합니다. 그러나 ("one" -> 1, 2 -> "two", 3 -> 3)은 호환되지 않는 튜플이므로 오류가 발생합니다.

m += ("one" -> 1) 

에서

당신은 Tuple2[Any, Any] 인수 Map[Any, Any]+ 방법을 요구하고있다. ("one" -> 1) 유형이 (String, Int) 인 반면 과 호환되므로 개별적으로 추가 할 수 있습니다. 당신이 할 수있는

참고도 수행 m("one")m(3)의 종류가 모두 Any을 그래서

m += ("one" -> 1, 2 -> "two", 3 -> 3) 

당신이지도의 요소를 조회

이, 리턴 값의 타입은, Any입니다. Any에는 + 연산자가 없으므로 m("one")+m(3)은 컴파일되지 않습니다. 두 값이 모두 Int이라면 캐스팅 할 수 있습니다.

m("one").asInstanceOf[Int] +m(3).asInstanceOf[Int] 
+0

그래, 더 많은 시행 착오를 발견했습니다. 'var mr2 = mr1.asInstanceOf [java.lang.Integer]' – pferrel

3

이것은 잘못된 것입니다 : 당신은 당신이 Map[Any,Any]로 선언하는하는 Tuple3m를 할당하려고

m = ("one" -> 1, 2 -> "two", 3 -> 3) 

. 당신은 의미 : 코드를 입력 Any의를 갖는 일이 거의 확실하게 나쁜 생각이라고

m = Map("one" -> 1, 2 -> "two", 3 -> 3) 

그러나, 그것은 주목할 가치가있다. 타입 안전성은 훌륭하고 Scala 사용의 주요 이점 중 하나입니다. 당신은 그것을 활용해야합니다.

m = ("one" -> 1, 2 -> "two", 3 -> 3) 

에서

관련 문제