2012-04-13
众所周知,Scala可以使用Java编写的所有类和方法。这是Scala的一个非常重大的优点。由于Scala编写的代码最终也会编译成.class文件,因此理论上Java也可以使用Scala的编写的类和方法。但是因为Scala拥有Java所没有的一些特质,并且在实际编译器处理之后会出现独特的变化,所以Java直接使用Scala编写出来的东西会需要一点额外工作。
1. 变量
我们定义一个简单的Scala类。
class AClass { val a: Int =1 var b: String ="abc" }
编译成class文件之后,我们用javap命令查看,如图1所示:
图1 编译后的scala类
我们发现变量消失了,而且还多了几个方法。那我们应该怎么对类里的变量赋值呢?其实很简单,可以赋值的var变量会生成一个新的方法。其命名规则是:void 变量名_$eq(变量类型 参数)。这个就是赋值的方法。而取值的方法就是与变量名同名的函数了(本例的a()和b())。简而言之,scala编译器为我们自动生成了getter和setter。
2. Option类
有时候我们会用到Option打包的对象比如Option[Int]的Some(1)。在Scala中我们可以Some(1)来表示,但如果在Java中我们就不能这样了。本质上Some(1)其实调用的是Option.apply()方法。因此,我们只要使用scala.Option.apply(1)就能得到Some(1)的效果。同样的道理,我们也可以Option.apply("abc")得到Some("abc")的效果。
不过,有一点需要注意的是Option.apply(new Integer(1))可是不能通过编译的。因为Scala并不能将java.lang.Integer直接转化成Int。
3. 参数是函数
Scala是第一类函数语言,对于Scala而言,任何东西都有值,即便是函数也能作为变量进行传递。
我们又定义一个类:
class BClass { def method(i:Int)(param: =>Double)={ val value = param println(i+":"+value) } }
编译成class文件之后,我们用javap命令查看,如图2所示:
图2 BClass转成class的实现
我们可以看到不带参数的函数参数param被转化成了一个scala.Function0类型的参数。因此,如果我们要使用BClass的method方法,我们只要把一个Fucntion0类型的参数传递进去即可。
本例的解决方法:
scala.Function0<Double> func = new scala.runtime.AbstractFunction0<Double>(){ public Double apply(){ //此处写你的具体实现吧 double d = 2.2d; return new Double(d); } }; BClass bClass = new BClass(); bClass.method(1, func);
在Scala中,作为参数的函数会变成FunctionN类型的对象(N是该函数的参数个数),具体更高级的应用请参考scala的API。
4. 心得
以上的方法其实不是很好玩,而且看上去代码易读性很差。如果非要用Scala的代码,不如多写几个能利于Java直接调用的封装类,而让Java直接调用这些封装类。是叫适配器设计模式(Adapter Pattern)吗?
相关推荐
从StdIn读取scala代码,并将其反编译的Java版本写入StdOut。 用法 确保您已安装Java 1.8和Maven 检出项目 在项目目录中调用mvn clean package 。 在目标目录中scala-to-java.jar将创建scala-to-java.jar 使用java...
例如,避免在Scala代码中使用Java的可变集合,因为这可能导致类型不匹配的问题。同样,当Java代码调用Scala代码时,需确保导入正确的Scala类和对象。 测试方面,你可以使用JUnit(Java测试框架)和ScalaTest(Scala...
这种混编允许开发团队在已有的Java项目中逐渐引入Scala代码,以利用其优势,同时保持与现有Java代码的兼容性。在实际应用中,可能会在服务端逻辑或者特定组件上使用Scala,而其他部分仍然使用Java,这样可以逐步过渡...
首先,Scala运行在Java虚拟机(JVM)上,这意味着它可以无缝地与Java库集成,同时也享受到了JVM的高性能和跨平台兼容性。它的语法设计简洁而富有表达力,使得代码更加易读和易维护。 在面向对象编程方面,Scala支持...
基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于java、scala、python、spark实现的图书推荐系统源码+项目说明.zip基于...
通过Maven,我们可以轻松地在Java项目中引入Scala代码,反之亦然。 首先,要实现Java和Scala的互调用,我们需要在`pom.xml`文件中配置Maven。确保`maven-compiler-plugin`和`scala-maven-plugin`已添加并正确配置。...
在Scala环境中,开发者经常使用IntelliJ IDEA或Scala IDE这样的集成开发环境(IDE),它们提供了对Scala语法的智能提示、代码调试和重构等功能。对于Java开发者来说,这些工具也支持Java项目,使得在两个语言间切换...
为了更好地从Java过渡到Scala,开发者需要了解这些核心概念并实践编写Scala代码。《面向Java开发人员的Scala指南》这本书将深入讲解这些主题,并通过实例帮助读者理解和应用。阅读本书,Java开发者不仅可以学习到...
本资源提供了一套基于Java、Scala和Spark的数据处理与分析设计源码,包含1381个文件,其中包括634个CRC文件,316个BK文件,35个Class字节码文件,20个XML配置文件,15个Java源代码文件,13个JAR打包文件,8个...
要使用它,请右键单击任何 Java 类、包或源文件夹,然后选择“转换为 Scala” 您还可以将 Java 代码复制到剪贴板,打开 Scala 编辑器,然后按 Ctrl+Shift+V(或右键单击并选择“粘贴(将 Java 转换为 Scala)”)...
由于Scala可以无缝集成到Java生态系统中,开发者可以在一个项目中同时使用两种语言,利用Scala的高级特性增强Java代码。 **经验技巧** 五页的PDF文档可能涵盖了以下几点: 1. **环境配置**:如何在Jelastic平台上...
2. **代码简洁性**:Scala支持模式匹配、隐式转换等特性,这使得Scala代码往往比等效的Java代码更加简洁、易于阅读和维护。 3. **类型安全**:Scala的类型系统非常强大,支持类型推断等功能,有助于减少运行时错误...
赠送源代码:scala-java8-compat_2.11-0.7.0-sources.jar; 赠送Maven依赖信息文件:scala-java8-compat_2.11-0.7.0.pom; 包含翻译后的API文档:scala-java8-compat_2.11-0.7.0-javadoc-API文档-中文(简体)-英语-...
相比于Java的冗长代码,Scala通过其强大的类型系统和表达式语法,能够用更少的代码实现同样的功能。例如,Java中的servlet需要重写多个方法如`doGet`和`doPost`,而在Scala中,可以通过高阶函数和模式匹配来简化这些...
赠送源代码:scala-java8-compat_2.11-0.7.0-sources.jar; 赠送Maven依赖信息文件:scala-java8-compat_2.11-0.7.0.pom; 包含翻译后的API文档:scala-java8-compat_2.11-0.7.0-javadoc-API文档-中文(简体)版.zip;...
Scala-SDK提供了一系列开发工具和库,包括编译器、开发环境、类库和插件,以帮助开发者更快速、高效地编写和调试Scala代码。 2. 向日葵(远程工具):向日葵是一种远程工具,可用于远程桌面访问、文件传输、屏幕...
基于Java+Scala实现的深圳地铁大数据客流分析系统源代码+数据+详细文档,该项目主要分析深圳通刷卡数据,通过大数据技术角度来研究深圳地铁客运能力,探索深圳地铁优化服务的方向 以下是我的开发环境,仅作参考: ...
在"scala: scala代码"的描述中,我们可以推测这是一个关于Scala编程语言的学习资源或者项目源代码。 1. **面向对象编程**:Scala是基于Java虚拟机(JVM)的语言,因此它兼容Java的所有类库。它支持类、对象和继承等...
"Java中的函数式编程_Java_Scala_下载.zip"可能包含的资料可能涵盖了如何在Java 8及更高版本中利用函数式编程技术,以及与Scala等函数式语言的对比分析,帮助开发者更好地理解和运用这些概念,提升代码质量和开发...