Làm thế nào để tạo một phiên bản của giao diện ẩn danh trong Kotlin?


95

Tôi có thư viện Java của bên thứ ba có một đối tượng có giao diện như thế này:

public interface Handler<C> {
  void call(C context) throws Exception;
}

Làm cách nào để tôi có thể triển khai ngắn gọn nó trong Kotlin tương tự như lớp ẩn danh Java như thế này:

Handler<MyContext> handler = new Handler<MyContext> {
   @Override
   public void call(MyContext context) throws Exception {
      System.out.println("Hello world");
   }
}

handler.call(myContext) // Prints "Hello world"

Câu trả lời:


143

Giả sử giao diện chỉ có một phương pháp duy nhất, bạn có thể sử dụng SAM

val handler = Handler<String> { println("Hello: $it") }

Nếu bạn có một phương thức chấp nhận một trình xử lý thì bạn thậm chí có thể bỏ qua các đối số kiểu:

fun acceptHandler(handler:Handler<String>){}

acceptHandler(Handler { println("Hello: $it") })

acceptHandler({ println("Hello: $it") })

acceptHandler { println("Hello: $it") }

Nếu giao diện có nhiều phương thức thì cú pháp dài dòng hơn một chút:

val handler = object: Handler2<String> {
    override fun call(context: String?) { println("Call: $context") }
    override fun run(context: String?) { println("Run: $context")  }
}

2
acceptHandler { println("Hello: $it")}cũng sẽ làm việc trong hầu hết các trường hợp
voddan

5
Cho bất cứ ai đang gặp khó khăn. tôi nghĩ rằng giao diện phải được khai báo trong java. tôi nghĩ rằng chuyển đổi SAM không hoạt động cho giao diện kotlin. nếu nó là giao diện kotlin, bạn phải sử dụng đối tượng: Handler {} cách. tại đây: youtrack.jetbrains.com/issue/KT-7770 .
j2emanue

2
Bạn có thể làm điều này với giao diện Kotlin kể từ ngày 1.4 - bạn chỉ cần khai báo nó như là một fun interface.
Nick

18

Tôi đã gặp một trường hợp mà tôi không muốn tạo var cho nó nhưng làm nó nội tuyến. Cách tôi đạt được nó là

funA(object: InterfaceListener {
                        override fun OnMethod1() {}

                        override fun OnMethod2() {}
})

14
     val obj = object : MyInterface {
         override fun function1(arg:Int) { ... }

         override fun function12(arg:Int,arg:Int) { ... }
     }

2

Câu trả lời đơn giản nhất có lẽ là lambda của Kotlin:

val handler = Handler<MyContext> {
  println("Hello world")
}

handler.call(myContext) // Prints "Hello world"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.