如何在Scala中实现具有可变参数方法的Java接口?

6

我正在实现一个包含可变参数方法的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 = ...
}

这有可能吗?
1个回答

9

您编写的代码可以直接使用。

Scala编译器将生成一个桥接方法,该方法实现了Java中所见的签名,并转发到Scala实现。

以下是在您完全按照编写的方式运行javap -c时类Awesome的结果:

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可变参数方法。带有Foo[]参数的第二个foo方法是由Scala编译器提供的桥接方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接