2011-09-23 39 views
6

Tôi đang thực hiện một giao diện Java có chứa các phương pháp variadic như vậy:Làm cách nào để triển khai giao diện Java với các phương thức variadic trong Scala?

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

Có thể thực hiện giao diện này trong Scala? Chức năng biến thể được xử lý khác nhau trong Scala, do đó, những điều sau đây sẽ không hoạt động:

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

Điều này thậm chí còn có thể?

Trả lời

9

Mã bạn đã viết hoạt động như hiện trạng.

Trình biên dịch scala sẽ tạo ra một phương thức cầu thực hiện chữ ký như được thấy từ Java và chuyển tiếp đến triển khai Scala.

Dưới đây là kết quả của việc chạy javap -c trên lớp của bạn tạo ảnh vui nhộn chính xác như bạn đã viết nó,

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 
} 

Phương pháp foo đầu tiên với với Seq < Foo> Lập luận tương ứng với Scala varargs phương pháp trong ảnh vui nhộn. Phương thức foo thứ hai với đối số Foo [] là phương thức cầu được trình biên dịch Scala cung cấp.

Các vấn đề liên quan