diff options
author | Paolo Giarrusso <p.giarrusso@gmail.com> | 2012-08-20 00:07:41 +0200 |
---|---|---|
committer | Paolo Giarrusso <p.giarrusso@gmail.com> | 2012-08-20 19:14:18 +0200 |
commit | 079e9e33327c497572c918f7d3155882b484e9ff (patch) | |
tree | f8b57640dbc915982dd1a7eabb714ae1a3dfab5b | |
parent | c32b189a2a2575512d0dc8d91a400d773b53a7f0 (diff) | |
download | scala-079e9e33327c497572c918f7d3155882b484e9ff.tar.gz scala-079e9e33327c497572c918f7d3155882b484e9ff.tar.bz2 scala-079e9e33327c497572c918f7d3155882b484e9ff.zip |
JavaConversions: Restore source compatibility with 2.9
Readd an implicit conversion which was available in 2.9, the one from
`java.util.concurrent.ConcurrentMap` (`juc.ConcurrentMap`) to the (now
deprecated) type `scala.collection.mutable.ConcurrentMap`.
This implicit conversion can also be used to convert from
`juc.ConcurrentMap`
to `collection.Map` and creates an ambiguity error in
test/files/run/map_java_conversions.scala. To fix this, I have given
lower priority to the new conversion.
Moreover, update the documentation in `JavaConversions`: mark this
conversion as deprecated and mention the new conversion which replaces
it, converting to `scala.collection.concurrent.Map`.
I discussed this issue previously with Paul Phillips on scala-language:
https://groups.google.com/d/topic/scala-language/uXKRiGXb-44/discussion
-rw-r--r-- | src/library/scala/collection/JavaConversions.scala | 3 | ||||
-rw-r--r-- | src/library/scala/collection/convert/WrapAsScala.scala | 22 | ||||
-rw-r--r-- | test/files/pos/javaConversions-2.10-regression.scala | 11 |
3 files changed, 34 insertions, 2 deletions
diff --git a/src/library/scala/collection/JavaConversions.scala b/src/library/scala/collection/JavaConversions.scala index a978a9a783..8e4fdf537d 100644 --- a/src/library/scala/collection/JavaConversions.scala +++ b/src/library/scala/collection/JavaConversions.scala @@ -22,7 +22,8 @@ import convert._ * scala.collection.mutable.Buffer <=> java.util.List * scala.collection.mutable.Set <=> java.util.Set * scala.collection.mutable.Map <=> java.util.{ Map, Dictionary } - * scala.collection.mutable.ConcurrentMap <=> java.util.concurrent.ConcurrentMap + * scala.collection.mutable.ConcurrentMap (deprecated since 2.10) <=> java.util.concurrent.ConcurrentMap + * scala.collection.concurrent.Map <=> java.util.concurrent.ConcurrentMap *}}} * In all cases, converting from a source type to a target type and back * again will return the original source object, eg. diff --git a/src/library/scala/collection/convert/WrapAsScala.scala b/src/library/scala/collection/convert/WrapAsScala.scala index 49f4d7cd99..c2994a0986 100644 --- a/src/library/scala/collection/convert/WrapAsScala.scala +++ b/src/library/scala/collection/convert/WrapAsScala.scala @@ -13,7 +13,27 @@ import java.{ lang => jl, util => ju }, java.util.{ concurrent => juc } import Wrappers._ import language.implicitConversions -trait WrapAsScala { +trait LowPriorityWrapAsScala { + this: WrapAsScala => + /** + * Implicitly converts a Java ConcurrentMap to a Scala mutable ConcurrentMap. + * The returned Scala ConcurrentMap is backed by the provided Java + * ConcurrentMap and any side-effects of using it via the Scala interface will + * be visible via the Java interface and vice versa. + * + * If the Java ConcurrentMap was previously obtained from an implicit or + * explicit call of `asConcurrentMap(scala.collection.mutable.ConcurrentMap)` + * then the original Scala ConcurrentMap will be returned. + * + * @param m The ConcurrentMap to be converted. + * @return A Scala mutable ConcurrentMap view of the argument. + */ + @deprecated("Use `mapAsScalaConcurrentMap` instead, and use `concurrent.Map` instead of `ConcurrentMap`.", "2.10.0") + implicit def mapAsScalaDeprecatedConcurrentMap[A, B](m: juc.ConcurrentMap[A, B]): mutable.ConcurrentMap[A, B] = + asScalaConcurrentMap(m) +} + +trait WrapAsScala extends LowPriorityWrapAsScala { /** * Implicitly converts a Java `Iterator` to a Scala `Iterator`. * diff --git a/test/files/pos/javaConversions-2.10-regression.scala b/test/files/pos/javaConversions-2.10-regression.scala new file mode 100644 index 0000000000..619c44b46d --- /dev/null +++ b/test/files/pos/javaConversions-2.10-regression.scala @@ -0,0 +1,11 @@ +import collection.{JavaConversions, mutable} +import JavaConversions._ +import java.util.concurrent.ConcurrentHashMap + +object Foo { + def buildCache2_9_simple[K <: AnyRef, V <: AnyRef]: mutable.ConcurrentMap[K, V] = + asScalaConcurrentMap(new ConcurrentHashMap()) + + def buildCache2_9_implicit[K <: AnyRef, V <: AnyRef]: mutable.ConcurrentMap[K, V] = + new ConcurrentHashMap[K, V]() +} |