diff options
author | Josh Suereth <Joshua.Suereth@gmail.com> | 2012-08-23 00:38:58 -0700 |
---|---|---|
committer | Josh Suereth <Joshua.Suereth@gmail.com> | 2012-08-23 00:38:58 -0700 |
commit | d0f49fe7a282f6516e7a2621693c11ceb06b91b1 (patch) | |
tree | eaefc7e0c22076a1860a693a6fd336021d665355 | |
parent | 79f4d775f9aab0e5c3e6af2ea078366ad4774929 (diff) | |
parent | bc621bad33cc897f43f2b30d1c8afe1912919cfe (diff) | |
download | scala-d0f49fe7a282f6516e7a2621693c11ceb06b91b1.tar.gz scala-d0f49fe7a282f6516e7a2621693c11ceb06b91b1.tar.bz2 scala-d0f49fe7a282f6516e7a2621693c11ceb06b91b1.zip |
Merge pull request #1172 from Blaisorblade/topic/deprecated-conversion
JavaConversions: Restore source compatibility with 2.9
5 files changed, 56 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/neg/javaConversions-2.10-ambiguity.check b/test/files/neg/javaConversions-2.10-ambiguity.check new file mode 100644 index 0000000000..c064a22964 --- /dev/null +++ b/test/files/neg/javaConversions-2.10-ambiguity.check @@ -0,0 +1,6 @@ +javaConversions-2.10-ambiguity.scala:8: error: type mismatch; + found : scala.collection.concurrent.Map[String,String] + required: scala.collection.mutable.ConcurrentMap[String,String] + assertType[mutable.ConcurrentMap[String, String]](a) + ^ +one error found diff --git a/test/files/neg/javaConversions-2.10-ambiguity.scala b/test/files/neg/javaConversions-2.10-ambiguity.scala new file mode 100644 index 0000000000..e856846a29 --- /dev/null +++ b/test/files/neg/javaConversions-2.10-ambiguity.scala @@ -0,0 +1,10 @@ +import collection.{JavaConversions, mutable, concurrent} +import JavaConversions._ +import java.util.concurrent.{ConcurrentHashMap => CHM} + +object Bar { + def assertType[T](t: T) = t + val a = new CHM[String, String]() += (("", "")) + assertType[mutable.ConcurrentMap[String, String]](a) +} +// vim: set et: 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..e1b81015ba --- /dev/null +++ b/test/files/pos/javaConversions-2.10-regression.scala @@ -0,0 +1,17 @@ +import collection.{JavaConversions, mutable, concurrent} +import JavaConversions._ +import java.util.concurrent.{ConcurrentHashMap => CHM} + +object Foo { + def buildCache2_9_simple[K <: AnyRef, V <: AnyRef]: mutable.ConcurrentMap[K, V] = + asScalaConcurrentMap(new CHM()) + + def buildCache2_9_implicit[K <: AnyRef, V <: AnyRef]: mutable.ConcurrentMap[K, V] = + new CHM[K, V]() +} + +object Bar { + def assertType[T](t: T) = t + val a = new CHM[String, String]() += (("", "")) + assertType[concurrent.Map[String, String]](a) +} |