当前位置:K88软件开发文章中心编程语言SQLscala → 文章内容

Java 与 Scala

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-19 4:45:35

/单例模式的方式。在 Java 中使用它会有点奇怪。没有一个使用它们的完美风格,但在 Scala2.8 中用起来并不很糟糕一个 Scala 单例对象会被编译成由“$”结尾的类。让我们创建一个类和一个伴生对象class TraitImpl(name: String) extends MyTrait { def traitName = name}object TraitImpl { def apply = new TraitImpl("foo") def apply(name: String) = new TraitImpl(name)}我们可以像这样天真地在 Java 中访问MyTrait foo = TraitImpl$.MODULE$.apply("foo");现在你可能会问自己,这是神马玩意?这是一个正常的反应。让我们来看看 TraitImpl$ 里面实际上是什么local ~/projects/interop/target/scala_2.8.1/classes/com/twitter/interop]$ javap TraitImpl\$Compiled from "Scalaisms.scala"public final class com.twitter.interop.TraitImpl$ extends java.lang.Object implements scala.ScalaObject{ public static final com.twitter.interop.TraitImpl$ MODULE$; public static {}; public com.twitter.interop.TraitImpl apply(); public com.twitter.interop.TraitImpl apply(java.lang.String);}其实它里面没有任何静态方法。取而代之的是一个名为MODULE$的静态成员。方法实现被委托给该成员。这使得访问代码很难看,但却是可行的。转发方法(Forwarding Methods)在 Scala2.8 中处理单例对象变得相对容易一点。如果你有一个类与一个伴生对象,2.8 编译器会生成转发方法在伴生类中。所以,如果你用 2.8,你可以像这样调用 TraitImpl 单例对象的方法MyTrait foo = TraitImpl.apply("foo");闭包函数Scala 的最重要的特点之一,就是把函数作为头等公民。让我们来定义一个类,它定义了一些以函数作为参数的方法。class ClosureClass { def printResult[T](f: => T) = { println(f) } def printResult[T](f: String => T) = { println(f("HI THERE")) }}在 Scala 中可以像这样调用val cc = new ClosureClasscc.printResult { "HI MOM" }在 Java 中却不那么容易,不过也并不可怕。让我们来看看 ClosureClass 实际上被编译成什么:[local ~/projects/interop/target/scala_2.8.1/classes/com/twitter/interop]$ javap ClosureClassCompiled from "Scalaisms.scala"public class com.twitter.interop.ClosureClass extends java.lang.Object implements scala.ScalaObject{ public void printResult(scala.Function0); public void printResult(scala.Function1); public com.twitter.interop.ClosureClass();}这也不是那么恐怖。“f: => T”被转义成“Function0”,“f: String => T”被转义成“Function1”。Scala 实际上从 Function0 定义到 Function22,最多支持 22 个参数。这真的应该足够了。现在我们只需要弄清楚如何在 Java 中使用这些东东。我们可以传入 Scala 提供的 AbstractFunction0 和 AbstractFunction1,像这样 @Test public void closureTest() { ClosureClass c = new ClosureClass(); c.printResult(new AbstractFunction0() { public String apply() { return "foo"; } }); c.printResult(new AbstractFunction1<String, String>() { public String apply(String arg) { return arg + "foo"; } }); }注意我们可以使用泛型参数。

上一页  [1] [2] 


Java 与 Scala