Scala支持与Java的隐式转换

Scala中操作Java集合
两种情况需要在Scala中操作Java集合。一种是Scala调用了其他的Java库,针对Java集合需要转换为Scala集合,如此才能享受Scala集合提供的福利;另一种是编写了Scala程序,但需要提供给Java库,为了更好地无缝集成,要让Java库体会不到Scala的存在。
Scala调用Java库
我在编写spark批量导入mongodb的程序中,用到伪代码:

    val client : MongoClient = new MongoClient("192.168.1.150")
    val findIterable:FindIterable[Document] = client.getDatabase("test").getCollection("test").find( new BasicDBObject("id","791279468"))
    for( doc:Document <- findIterable ){

    }

这时编译会报miss parameter type for expanded function, the argument types of an anonymous function must be fully known(SLS 8.5)
经过查阅资料,才知道导入该包:需要进行隐式转换
import scala.collection.JavaConversions._

Scala的代码以Java库的形式提供给Java调用者
在JVM平台下进行多语言开发时,多数情况下会以Java为主,而对于一些特定场景,能够更好发挥Scala特性的,例如并发处理等,则会选择Scala。此时,若要做到对Java友好,则对于Scala的方法返回值,应尽量屏蔽Scala的类型信息。

Java中操作Scala集合
Java要调用Scala代码,而不幸的,这个需要调用的Scala代码不够体贴,直接返回了Scala的集合类型。由于Java不提供自定义隐式转换的功能,因此,只能调用Scala提供的转换类进行显式转换。例如Scala中的XmlConfigure类,其readSoftInfos()返回的是Scala的Seq:

  import scala.collection.JavaConversions;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class XmlConfigureJavaTest {
@Test
public void should_load_xml_file() {
XmlConfigure xmlConfigure = new XmlConfigure();
List softInfos = JavaConversions.asJavaList(xmlConfigure.readSoftInfos(“/config.xml”, “version number”));
assertThat(softInfos.size(), is(7));
}
}
在readSoftInfos()函数返回的为Scala集合类型的情况下,若不进行显示转换,则无法通过编译。

Scala的隐式转换
Scala对Java集合与Scala集合之间的互相转换都用到了Scala提供的隐式转换功能。我们导入的JavaConversions就是承担这种转换的一个Facade Object。它扩展了两个trait:WrapAsScala和WrapAsJava。在JavaConversions对象中定义的方法实际上是将请求委派自它继承的trait的隐式转换函数。例如将Seq转换为java的List:

  object JavaConversions extends WrapAsScala with WrapAsJava {

def asJavaList[A](b : Seq[A]): ju.List[A] = seqAsJavaListA
}
seqAsJavaList就是定义在WrapAsJava中的隐式转换函数。在这个函数中又作了一个模式匹配。如果匹配JListWrapper,则调用传入的wrapped参数的asInstanseOf进行类型转换;否则,就将该seq作为参数传递给包装器SeqWrapper。包装器SeqWrapper是Scala定义的样例类(case class),扩展自Java的AbstractList

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值