如何在Scala中使用可变方法实现Java接口?
发布时间:2020-12-16 18:59:11 所属栏目:安全 来源:网络整理
导读:我正在实现一个包含可变方法的 Java接口,如下所示: interface Footastic { void foo(Foo... args);} 是否可以在Scala中实现此接口?变量函数在Scala中的处理方式不同,因此以下方法不起作用: class Awesome extends Footastic { def foo(args: Foo*): Unit
我正在实现一个包含可变方法的
Java接口,如下所示:
interface Footastic { void foo(Foo... args); } 是否可以在Scala中实现此接口?变量函数在Scala中的处理方式不同,因此以下方法不起作用: class Awesome extends Footastic { def foo(args: Foo*): Unit = { println("WIN"); } // also no good: def foo(args: Array[Foo]): Unit = ... } 这甚至可能吗? 解决方法
您编写的代码按原样运行.
scala编译器将生成一个桥接方法,该方法实现从Java看到的签名并转发到Scala实现. 这是在你的类上运行javap -c的结果,就像你写的那样, public class Awesome implements Footastic,scala.ScalaObject { public void foo(scala.collection.Seq<Foo>); Code: 0: getstatic #11 // Field scala/Predef$.MODULE$:Lscala/Predef$; 3: ldc #14 // String WIN 5: invokevirtual #18 // Method scala/Predef$.println:(Ljava/lang/Object;)V 8: return public void foo(Foo[]); Code: 0: aload_0 1: getstatic #11 // Field scala/Predef$.MODULE$:Lscala/Predef$; 4: aload_1 5: checkcast #28 // class "[Ljava/lang/Object;" 8: invokevirtual #32 // Method scala/Predef$.wrapRefArray:([Ljava/lang/Object;)Lscala/collection/mutable/WrappedArray; 11: invokevirtual #36 // Method foo:(Lscala/collection/Seq;)V 14: return public Awesome(); Code: 0: aload_0 1: invokespecial #43 // Method java/lang/Object."<init>":()V 4: return } 使用Seq< Foo>的第一个foo方法参数对应于Awesome中的Scala varargs方法.带有Foo []参数的第二个foo方法是Scala编译器提供的桥接方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |