Let's maybe deprecate, but not remove, JavaConversions.asScalaConcurrentMap?

625 views
Skip to first unread message

Paolo Giarrusso

unread,
Aug 4, 2012, 7:46:07 PM8/4/12
to scala-l...@googlegroups.com
The following code works in 2.9.1, but doesn't in 2.10 - JavaConversions .asScalaConcurrentMap is not only deprecated together with its return type, but no more implicit. As many other such conversions, it has an implicit replacement, but it returns a different (non-deprecated) type. I see why a clean up has advantages, but using deprecation (instead of removing members abruptly) makes only sense if the old code keeps compiling whenever possible. Hence, keeping the deprecated implicit conversion here (possibly under another name) would be necessary.

import collection.{JavaConversions, mutable}
import JavaConversions._
import java.util.concurrent.ConcurrentHashMap

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]() //Side annoyance, well known: I can't omit [K, V] when relying on the implicit conversion - type inference doesn't work here.

Cheers,
Paolo

Paul Phillips

unread,
Aug 4, 2012, 8:22:55 PM8/4/12
to scala-l...@googlegroups.com


On Sat, Aug 4, 2012 at 4:46 PM, Paolo Giarrusso <p.gia...@gmail.com> wrote:
The following code works in 2.9.1, but doesn't in 2.10 - JavaConversions .asScalaConcurrentMap is not only deprecated together with its return type, but no more implicit. As many other such conversions, it has an implicit replacement, but it returns a different (non-deprecated) type. I see why a clean up has advantages, but using deprecation (instead of removing members abruptly) makes only sense if the old code keeps compiling whenever possible. Hence, keeping the deprecated implicit conversion here (possibly under another name) would be necessary.

You can try to improve on the situation, but I don't think it'll be that easy.


object JavaConversions extends WrapAsScala with WrapAsJava {
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type ConcurrentMapWrapper[A, B]  = Wrappers.ConcurrentMapWrapper[A, B]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type DictionaryWrapper[A, B]     = Wrappers.DictionaryWrapper[A, B]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type IterableWrapper[A]          = Wrappers.IterableWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type IteratorWrapper[A]          = Wrappers.IteratorWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type JCollectionWrapper[A]       = Wrappers.JCollectionWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type JConcurrentMapWrapper[A, B] = Wrappers.JConcurrentMapWrapper[A, B]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type JDictionaryWrapper[A, B]    = Wrappers.JDictionaryWrapper[A, B]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type JEnumerationWrapper[A]      = Wrappers.JEnumerationWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type JIterableWrapper[A]         = Wrappers.JIterableWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type JIteratorWrapper[A]         = Wrappers.JIteratorWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type JListWrapper[A]             = Wrappers.JListWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type JMapWrapper[A, B]           = Wrappers.JMapWrapper[A, B]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type JPropertiesWrapper          = Wrappers.JPropertiesWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type JSetWrapper[A]              = Wrappers.JSetWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type MapWrapper[A, B]            = Wrappers.MapWrapper[A, B]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type MutableBufferWrapper[A]     = Wrappers.MutableBufferWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type MutableMapWrapper[A, B]     = Wrappers.MutableMapWrapper[A, B]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type MutableSeqWrapper[A]        = Wrappers.MutableSeqWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type MutableSetWrapper[A]        = Wrappers.MutableSetWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type SeqWrapper[A]               = Wrappers.SeqWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type SetWrapper[A]               = Wrappers.SetWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") type ToIteratorWrapper[A]        = Wrappers.ToIteratorWrapper[A]
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val DictionaryWrapper            = Wrappers.DictionaryWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val IterableWrapper              = Wrappers.IterableWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val IteratorWrapper              = Wrappers.IteratorWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val JCollectionWrapper           = Wrappers.JCollectionWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val JConcurrentMapWrapper        = Wrappers.JConcurrentMapWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val JDictionaryWrapper           = Wrappers.JDictionaryWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val JEnumerationWrapper          = Wrappers.JEnumerationWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val JIterableWrapper             = Wrappers.JIterableWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val JIteratorWrapper             = Wrappers.JIteratorWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val JListWrapper                 = Wrappers.JListWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val JMapWrapper                  = Wrappers.JMapWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val JPropertiesWrapper           = Wrappers.JPropertiesWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val JSetWrapper                  = Wrappers.JSetWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val MutableBufferWrapper         = Wrappers.MutableBufferWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val MutableMapWrapper            = Wrappers.MutableMapWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val MutableSeqWrapper            = Wrappers.MutableSeqWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val MutableSetWrapper            = Wrappers.MutableSetWrapper
  @deprecated("Use a member of scala.collection.convert.Wrappers", "2.10.0") val SeqWrapper                   = Wrappers.SeqWrapper

  // Note to implementors: the cavalcade of deprecated methods herein should
  // serve as a warning to any who follow: don't overload implicit methods.

  @deprecated("use bufferAsJavaList instead", "2.9.0")
  def asJavaList[A](b : mutable.Buffer[A]): ju.List[A] = bufferAsJavaList[A](b)

  @deprecated("use mutableSeqAsJavaList instead", "2.9.0")
  def asJavaList[A](b : mutable.Seq[A]): ju.List[A] = mutableSeqAsJavaList[A](b)

  @deprecated("use seqAsJavaList instead", "2.9.0")
  def asJavaList[A](b : Seq[A]): ju.List[A] = seqAsJavaList[A](b)

  @deprecated("use mutableSetAsJavaSet instead", "2.9.0")
  def asJavaSet[A](s : mutable.Set[A]): ju.Set[A] = mutableSetAsJavaSet[A](s)

  @deprecated("use setAsJavaSet instead", "2.9.0")
  def asJavaSet[A](s: Set[A]): ju.Set[A] = setAsJavaSet[A](s)

  @deprecated("use mutableMapAsJavaMap instead", "2.9.0")
  def asJavaMap[A, B](m : mutable.Map[A, B]): ju.Map[A, B] = mutableMapAsJavaMap[A, B](m)

  @deprecated("use mapAsJavaMap instead", "2.9.0")
  def asJavaMap[A, B](m : Map[A, B]): ju.Map[A, B] = mapAsJavaMap[A, B](m)

  @deprecated("use iterableAsScalaIterable instead", "2.9.0")
  def asScalaIterable[A](i : jl.Iterable[A]): Iterable[A] = iterableAsScalaIterable[A](i)

  @deprecated("use collectionAsScalaIterable instead", "2.9.0")
  def asScalaIterable[A](i : ju.Collection[A]): Iterable[A] = collectionAsScalaIterable[A](i)

  @deprecated("use mapAsScalaMap instead", "2.9.0")
  def asScalaMap[A, B](m: ju.Map[A, B]): mutable.Map[A, B] = mapAsScalaMap[A, B](m)

  @deprecated("use propertiesAsScalaMap instead", "2.9.0")
  def asScalaMap(p: ju.Properties): mutable.Map[String, String] = propertiesAsScalaMap(p)
}


Paolo Giarrusso

unread,
Aug 4, 2012, 9:26:54 PM8/4/12
to scala-l...@googlegroups.com
I've seen that mess, although the bugtracker entry is informative.
Still, my problem is not with the renaming itself.

I simply propose to add, within trait WrapAsScala, an implicit alias
to asScalaConcurrentMap, named (for instance)
mapAsScalaDeprecatedConcurrentMap (hoping this name is not used). The
code would be the following:

@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)

Plus, in the documentation of JavaConversions, this change is needed:
- scala.collection.mutable.ConcurrentMap <=>
java.util.concurrent.ConcurrentMap
+ scala.collection.mutable.ConcurrentMap (deprecated) <=>
java.util.concurrent.ConcurrentMap
+ scala.collection.concurrent.Map <=> java.util.concurrent.ConcurrentMap

Now, this does sound easy, so maybe there's something else I'm
missing. Is there? I've briefly checked, but there doesn't seem to be
any other conversion in the same situation (that is, whose return type
has been deprecated).

Cheers,
Paolo
--
Paolo Giarrusso - Ph.D. Student, Philipps-University Marburg
http://www.informatik.uni-marburg.de/~pgiarrusso/

Paul Phillips

unread,
Aug 5, 2012, 12:33:02 PM8/5/12
to scala-l...@googlegroups.com


On Sat, Aug 4, 2012 at 6:26 PM, Paolo Giarrusso <pgiar...@mathematik.uni-marburg.de> wrote:
Now, this does sound easy, so maybe there's something else I'm
missing. Is there?

I don't know.  I suggest testing it and sending a pull request.

Paolo Giarrusso

unread,
Aug 21, 2012, 7:52:33 AM8/21/12
to scala-l...@googlegroups.com
There was a minor problem but I solved it, hence I finally got to submit this pull request:

https://github.com/scala/scala/pull/1172

The problem is described there directly.

Bye
Reply all
Reply to author
Forward
0 new messages