okarahan
okarahan

Reputation: 139

Scala compiler says: value & is not a member of java.lang.object

I am very new to Scala, I try some tutorials but I didn't get the point in this problem here:

val reverse = new mutable.HashMap[String, String]() with mutable.SynchronizedMap[String, String]  

def search(query: String) = Future.value {
  val tokens = query.split(" ")
  val hits = tokens map { token => reverse.getOrElse(token, Set()) }
  if (hits.isEmpty)
    Nil
  else
    hits reduceLeft {_ & _} toList // value & is not a member of java.lang.Object
}

The compiler says value & is not a member of java.lang.Object. Can somebody explain me why I am getting a compiler error ? I have this from this tutorial here: https://twitter.github.io/scala_school/searchbird.html

Upvotes: 0

Views: 2537

Answers (2)

Kadreal
Kadreal

Reputation: 21

Mohit Has The right answer, you end up with an Array of objects. This is because your HashMap for reverse has a value type of String, so it'll return a String for a given key. Your getOrElse however, will return a Set type if the key is not found in your HashMap reverse. These need to return the same type so you don't end up with an Array[Objects]

If you notice a few lines above in the tutorial you linked, reverse is defined as follows:

val reverse = new mutable.HashMap[String, Set[String]] with mutable.SynchronizedMap[String, Set[String]]

Upvotes: 2

mohit
mohit

Reputation: 4999

"tokens" is of type Array[String]. Now, when you iterate over the array, there are two possibilities. Either reverse will have a value for the token or not. If it has, then the Array element get a string value otherwise an empty set.

For example: Lets say reverse has two values - ("a" -> "a1", "b" ->"b1") a maps to a1 and b maps to b1.

Suppose, The query string is "a c". tokens will be ["a","c"] after splitting. After mapping you will get in array ["a1", Set()] (a got mapped to a1 and there is no value for "c" in the map hence, you got an empty Set())

Now, the overall type of the hits array is Array[Object]. So, now you are getting an error as the last line will be "&" operator on 2 Objects according to the compiler.

Upvotes: 4

Related Questions