कैसे कोटलिन में गुमनाम इंटरफ़ेस का एक उदाहरण बनाने के लिए?


95

मेरे पास एक तृतीय पक्ष जावा पुस्तकालय है जो इस तरह के इंटरफेस के साथ एक वस्तु है:

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

मैं इसे संक्षिप्त रूप से जावा अनाम वर्ग के समान कोटलिन में कैसे लागू कर सकता हूं:

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"

जवाबों:


143

मान लें कि इंटरफ़ेस में केवल एक ही विधि है जो आप एसएएम का उपयोग कर सकते हैं

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

यदि आपके पास एक तरीका है जो एक हैंडलर को स्वीकार करता है तो आप टाइप तर्क भी छोड़ सकते हैं:

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

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

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

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

यदि इंटरफ़ेस में एक से अधिक विधि है, तो सिंटैक्स थोड़ा अधिक क्रिया है:

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")}ज्यादातर मामलों में भी काम करेगा
वोदन

5
संघर्षरत किसी के लिए। मुझे लगता है कि इंटरफ़ेस को जावा में घोषित किया जाना चाहिए। मुझे लगता है कि सैम रूपांतरण कोटलिन इंटरफेस के लिए काम नहीं कर रहा है। यदि इसका कोटलिन इंटरफ़ेस आपको ऑब्जेक्ट का उपयोग करना है: हैंडलर {} तरीका। यहाँ प्रति: youtrack.jetbrains.com/issue/KT-7770
j2emanue

2
आप इसे कोटलिन इंटरफ़ेस के साथ 1.4 के रूप में कर सकते हैं - आप इसे केवल एक के रूप में घोषित करते हैं fun interface
निक

18

मेरे पास एक मामला था जहां मैं इसके लिए एक संस्करण नहीं बनाना चाहता था लेकिन यह इनलाइन करता हूं। जिस तरह से मैंने इसे हासिल किया है

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) { ... }
     }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.