2011-08-04 34 views
7

在下面的任何方式选择使用asJavaIterable?我知道我可以拼出特定的函数名称,但我想知道如果我可以只声明指定我想要的类型。我也很好奇,为什么JavaJavaIterable不会优先于JavaJavaCollection。解决Scala中模糊的隐式转换问题

scala> import scala.collection.JavaConversions._ 
import scala.collection.JavaConversions._ 

scala> Iterable(0,1):java.lang.Iterable[Int] 
<console>:11: error: type mismatch; 
found : Iterable[Int] 
required: java.lang.Iterable[Int] 
Note that implicit conversions are not applicable because they are ambiguous: 
both method asJavaIterable in object JavaConversions of type [A](i: Iterable[A])java.lang.Iterable[A] 
and method asJavaCollection in object JavaConversions of type [A](i: Iterable[A])java.util.Collection[A] 
are possible conversion functions from Iterable[Int] to java.lang.Iterable[Int] 
     Iterable(0,1):java.lang.Iterable[Int] 
      ^

回答

12

这有可能限制进口的范围,使asJavaCollection将不予考虑:

import scala.collection.JavaConversions.{asJavaCollection=>_,_} 

这上面说,“进口JavaConversions的所有成员,除了asJavaCollection”。

但是,我认为它最好导入JavaConverters并明确您的转换。

import scala.collection.JavaConverters._ 

Iterable(0,1).asJava