2011-09-23 23 views
6

Değişkenler içeren bir Java arayüzünü şu şekilde uyguluyorum:Scala'da variadic yöntemlerle Java arayüzünü nasıl uygularım?

interface Footastic { 
    void foo(Foo... args); 
} 

Bu arayüzü Scala'da uygulamak mümkün mü? Variadic işlevleri Scala'da farklı şekilde ele alınır, bu nedenle aşağıdakiler işe yaramaz:

class Awesome extends Footastic { 
    def foo(args: Foo*): Unit = { println("WIN"); } 
    // also no good: def foo(args: Array[Foo]): Unit = ... 
} 

Bu mümkün mü?

cevap

9

Yazdığınız kod çalışır.

Scala derleyicisi, Java'dan ve ileriye doğru Scala uygulamasına göre imzayı uygulayan bir köprü yöntemi oluşturur.

İşte Scala Müthiş yöntemi varargs için Dizi < Foo ile birlikte

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 
} 

ilk foo yöntemi> argüman karşılık gelir sen yazdın tam olarak Müthiş classınıza javap -c çalışan sonucudur. Foo [] argümanı ile ikinci foo yöntemi, Scala derleyicisi tarafından sağlanan köprü metodudur.